Connexion SOCKET_ERROR [Résolu]

Signaler
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008
-
Salut a tous,
Je réalise un ptit programme au sein duquel je me connecte a un serveur distant, afin de récupérer via une methode GET des informations necessaires a la generation de différents ecrans...
Mon probleme est celui-ci : je me connecte une premiere fois a la servlet distante, puis lorsque je veux afficher mon deuxieme ecran et que je fais un deuxieme appel, cela ne marche pas a chaque fois. J'ai quatre ecrans "sous le coude", et je n'arrive jamais non plus a acceder au 4eme voire au 3eme lors du lancement d'une meme application.
J'aimerais donc savoir coment je pourrais adapter mon code, afin d'avoir une boucle me permettant d'essayer de se reconnecter jusqu'a ce que cela fonctionne...
Voici le code :
// recuperation du contenu via l'API Winsock
char* RecupererContenuURL()
{
    WSADATA WSAData;
    int iResult = WSAStartup(MAKEWORD(2,0), &WSAData);
    if (iResult != NO_ERROR)
        MessageBox(NULL, TEXT("Error at WSAStartup()"),TEXT("Erreur"),MB_OK);

    SOCKET sock;
    SOCKADDR_IN sin;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET)
        MessageBox(NULL, TEXT("Error at socket"),TEXT("Erreur"),MB_OK);

    char cBuffligne[1024]="";
    char canal[200]="";
    char* retour = NULL;

   ...creation de ma requete GET...

    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) // on se connecte sur le serveur.
        MessageBox(NULL,TEXT("Erreur Reception Donnees"),TEXT("Erreur"),MB_OK);    // si probleme on le signale -> c'est ici ou cela plante souvent

    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();
   
   ...recuperation de la variable retour
    return retour;                        // renvoi du resultat
}

A signaler que lorsque ca plante, si je relance mon appli, alors il va bien m'afficher l'ecran suivant (cest a dire celui que j'etais censé avoir lors du plantage...), mais va encore planter peut etre deux ecrans plus tard...
J'ai essayer des boucles while sans succes...
Merci d'avance!

5 réponses

Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Salut !
Le problème vien du messagebox, c'est pas "Erreur Reception Donnees" mais "Erreur Connexion" !

Je rigole bien sur.

Essayes d'ajouter un memset(&sin, 0, sizeof(sin)); avant le remplissage de ta structure.
Cette structure ne contient pas que 3 champs, si tu mets pas les champs à 0 ils risquent de configurer des trucs inattendus.

Sinon, à la place de tes messagesbox, tu devrais construire un message un peu plus precis via les fonctions GetLastError et FormatMessage. Parce que c'est bien de savoir que ya eu une erreur, mais c'est mieu de savoir pourquoi il y a eu une erreure. Ca t'indira peut-être pourquoi ta fonction échoue.
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut,
Euh j'ai rajouté le memset avant


sin.sin_addr.s_addr = inet_addr(adresseIpFichierIni); ...
Mais ca ne change rien...
Sinon je n'ai jamais utilisé le formatage d'erreur, je vais essayer de voir ça.
As tu une autre idée? dois je faire autre chose que le memset?
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Euh erreur 10049...
Je suis mal barré?  ^^
Merci
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

GetLastError te retourne un code erreur a utiliser dans FormatMessage pour avoir un texte en clair. Sinon, fournit avec VS, il y a un tools, "errlook.exe" ou quelque chose comme ca. Tu lui donne ton code erreur et il te sort la phrase associée.
En l'occurence, l'erreur 10049 est catégorisée par ce message :
"L'adresse demandée n'est pas valide dans son contexte."
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

En effet l'erreur venait (encore une fois) de moi
A force d'appeler ma servlet, une variable se réinitialisait mal (je ne comprends toujours pas pourquoi qu'au bout de la troisieme fois elle me fait ca), ce qui fait que ma requete GET etait mal formée au final, d'où le message d'erreur 10049...
Merci beaucoup ctx_man,
Bonne continuation!
Merci encore