Probleme Winsock

Résolu
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 8 nov. 2007 à 09:11
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 8 nov. 2007 à 10:14
Salut a vous,
Je suis toujours en train de passer une appli de embedded visual c++ (donc pour Windows CE => Pocket Pc) vers DevC++ (windows "normal", appli windows).
Tous les fonctionnements semblent similaires, cependant j'ai un probleme au niveau de mes requetes HTTP envoyées vers un serveur.

Pour mon premier écran, j'emets une requete GET : j'arrive a afficher ce premier ecran sur les deux appli
Pour les ecrans suivants, j'envoi egalement des données, je fais donc une requete POST : or avec evc++, pas de souci les ecrans s'enchainent, mais avec DEVC++, paf erreur 400 Mauvaise requete!!
Voici un bout de code pour etre plus explicite :
    WSADATA WSAData;
    int iResult = WSAStartup(MAKEWORD(2,0), &WSAData);
    if (iResult != NO_ERROR){
        WSACleanup();
        return NULL;
    }

    SOCKET sock;
    SOCKADDR_IN sin;

    sock = socket(AF_INET, SOCK_STREAM, 0);                    // on verifie la validite de la socket
    if (sock == INVALID_SOCKET) {
        WSACleanup();
        return NULL;
    }

    char cBuffligne[3000]="";
    char canal[2000]="";
    char* retour = NULL;

    strcpy(canal,"GET ");                                    // creation de la requete HTTP, methode GET
    strcat(canal, cheminFichierIni);                            // chemin du fichier, genre "/ecran.txt"
    strcat(canal," HTTP/1.1\r\nHost: ");                    // type HTTP, suivi de l'adresse Host
    strcat(canal,adresseIpFichierIni);                        // adresse IP
    strcat(canal,"\r\n\r\n");                                // deux retour chariot

    memset(&sin, 0, sizeof(sin));
    sin.sin_addr.s_addr = inet_addr(adresseIpFichierIni);    // adresse IP a laquelle se connecter
    sin.sin_family = AF_INET;
    sin.sin_port = htons(atoi(portFichierIni));                // port HTTP.

    if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR) {
        WSACleanup();
        return NULL;
    }

    send(sock, canal, strlen(canal), 0);            // on envoie la requête HTTP.
    recv(sock, cBuffligne, sizeof(cBuffligne), 0);    // reception des donnees dans le buffer
    closesocket(sock);                                // on ferme le socket.
    WSACleanup(); => METHODE GET, pas de probleme surt les deux applis
-------------------------------------------------------

    char canal[2000]="";                                           
    WSADATA WSAData;
    int iResult = WSAStartup(MAKEWORD(2,0), &WSAData);
    if (iResult != NO_ERROR){...    }
    SOCKET sock;
    SOCKADDR_IN sin;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) { ...    }

    TCHAR chaineLength[10];
    swprintf(chaineLength,TEXT("%d"),strlen(chainePostee));        // recuperation de la longueur de la chaine a renvoyer
    strcpy(canal,"POST ");                                        // methode employee
    strcat(canal,cheminFichierIni);
    strcat(canal,"?");
    strcat(canal," HTTP/1.1\r\nHost: ");                        // chemin de la servlet
    strcat(canal,adresseIpFichierIni);    // adresse du serveur   
    strcat(canal,"\r\nConnection: Close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ");
    strcat(canal, ConvertUnicodeToAnsi(chaineLength));            // longueur chaine renvoyee (content-length)
    strcat(canal,"\r\n\r\n");                                    // deux retours chariots
    strcat(canal,chainePostee);                                    // la chaine a renvoyer
    strcat(canal,"\r\n\r\n");                                    // et encore deux retours chariot

    sin.sin_addr.s_addr = inet_addr(adresseIpFichierIni);        // serveur auquel on envoie la requete
    sin.sin_family = AF_INET;
    sin.sin_port = htons(atoi(portFichierIni));                    // port HTTP.

    if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR){ ...}

    send(sock, canal, strlen(canal), 0);                    // on envoie la requête HTTP.
    char cBuffligne[3000]="";
    recv(sock, cBuffligne, sizeof(cBuffligne), 0);    // reception des donnees dans le buffer

    closesocket(sock);                                        // on ferme le socket.
    WSACleanup(); => METHODE POST : Mauvaise requete pour la version Windows "normal"
Voila, si quelqu'un a une idée, je lui en suis tres reconnaissant, car la mon appli ne peut pas tourner...

1 réponse

fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
8 nov. 2007 à 10:14
Youpiiiiii!!
En cherchant bien, j'ai trouvé l'erreur!!!
Pour le POST, je suis obligé de fournir la longueur de la chaine renvoyé. Or pour passer le int en chaine de caracteres, la fonction est swprintf sous evc++, alors qu'en C c'est sprintf simplement...

Le bonheur, ca passe maintenant. Je crois ke je vais aller tous les verifier. Dommage que le compilateur ne m'a pas jeté dès la compilation, comme il me lavait fait pour les _ftprintf et compagnie...
Merci a vous quand meme, j'espere que ca pourra aider quelqu'un! ^^
3
Rejoignez-nous