Le recv pas bloquant?

Résolu
harddisk Messages postés 54 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 13 mai 2007 - 2 avril 2007 à 19:39
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 3 avril 2007 à 01:14
Hello,
j'ai lu un peu partout que le recv est bloquant, hors chez moi ca n'est pas le cas.

        int lgdonneesinout;
        lgdonneesinout = sizeof(sockaddr);
        cout<<"Listening"<<endl;
        val=accept(sock, (SOCKADDR *)&csin, &lgdonneesinout);
        cout<<"Accepted :"<<val<<endl;
        if(val != INVALID_SOCKET)
        {
       
            char buffer[50];
            lgdonneesinout=recv(sock,buffer,50,0);
           
            if (lgdonneesinout==SOCKET_ERROR) printf("recv failed: %d\n", WSAGetLastError());//10057:not connected
            cout<>f;
        envoyed=send(sock, sendbuf, strlen(sendbuf), 0);
        cout<<"Envoye:"<<envoyed<<endl;
        shutdown(sock,SD_BOTH);   

3 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
2 avril 2007 à 20:10
Salut harddisk,

L'erreur est pourtant explicite, tu fais un recv sur un socket qui n'est pas connecté.

Essaye en utilisant le socket du client (val) dans ton recv.
3
harddisk Messages postés 54 Date d'inscription vendredi 28 décembre 2001 Statut Membre Dernière intervention 13 mai 2007
2 avril 2007 à 22:25
Merci!

Juste une question, quand tu dis "pas connecté" ca veut dire que sock est lié à rien du tout? Pas qu'il faille faire un connect() en plus du accept ?
Le coup du val ca marche,au effet de bord prets: mon buffer de reception est plus gros que celui effectivement envoyé donc les caractère à la fin de buffer sont faux(je sens que je vais devoir verifier la fin de chaine "à la main", ou réussir à faire envoyer des string par le socket...)

Et si j'ai bien compris en fait, le val est un descripteur de socket, qui fait reference à un socket créé quelquepart auquel je n'ai pas "access" comme la structure sock, mais ca me suffit pour les send/recv?
Et mon socket sock, n'a pas été modifié, je peut le réutiliser derrière?

Désolé pour le nombre de question, mais quand ca marche, j'aime bien comprendre a peu pres les implications, car au debut j'avais pas du tout compris les socket dans ce sens.

Encore Merci.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 avril 2007 à 01:14
Salut,

- sock n'est pas lié a rien du tout puisqu'il est lié a une adresse locale (en l'occurence, l'adresse 127.0.0.1:6969).

Un socket connecté est quant a lui lié a une adresse locale et une
adresse distante (sinon on pourrait pas vraiment parler de
'connexion'). Pour savoir quelles sont les adresses locales et
distantes d'un socket, tu as deux fonctions: getsockname et
getpeername, respectivement.

- l'effet de bord que tu décris n'en est pas un: lorsque tu envoies ta
chaine tu envoies strlen() octet, c'est a dire que tu n'envoies pas le
'\0' final de ta chaine, et donc quand tu essayes de l'afficher a
l'autre bout... boom.

- val est un socket au meme titre que sock, tu peux utiliser toutes les fonctions: send, recv, getsockname, getsockopt...

- ton sock n'a pas été modifié, mais il est lié (bind) et en mode
écoute (listen), donc tout ce que tu peux faire maintenant c'est soit
re-accepter des connexions, soit le fermer.


et un petit conseil pour la route, oublie le tuto de theWalrus.
0
Rejoignez-nous