begin process at 2010 03 16 08:52:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

Le recv pas bloquant?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Le recv pas bloquant?

lundi 2 avril 2007 à 19:39:24 | Le recv pas bloquant?

harddisk

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<<buffer<<endl;

Je lance le serveur. il m'affiche Listening
Et des qu'un client se connect sans rien envoyer, il m'affiche "Accepted" puis n'importe dans le buffer quoi et une erreur 10057.Comme si le recv avait recu quelque chose.
(Si vous voulez les definitions des socket etc dites le moi, mais j'ai pris le tuto de theWalrus sur developpez.com)

Qu'ai je fait de travers?
Merci


PS: pour info, le code du client:

        int envoyed;
        char * sendbuf = "Client: sending data test";
        sock = socket(AF_INET, SOCK_STREAM, 0);
        sin.sin_addr.s_addr            = inet_addr("127.0.0.1");
        sin.sin_family                = AF_INET;
        sin.sin_port                = htons(6969);
        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
        cout<<"attente pour envoyer"<<endl;
        cin>>f;
        envoyed=send(sock, sendbuf, strlen(sendbuf), 0);
        cout<<"Envoye:"<<envoyed<<endl;
        shutdown(sock,SD_BOTH);   
lundi 2 avril 2007 à 20:10:43 | Re : Le recv pas bloquant?

aardman

Membre Club
Réponse acceptée !
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.

lundi 2 avril 2007 à 22:25:50 | Re : Le recv pas bloquant?

harddisk


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.
mardi 3 avril 2007 à 01:14:42 | Re : Le recv pas bloquant?

aardman

Membre Club
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.




Cette discussion est classée dans : sin, sock, cout, recv, lgdonneesinout


Répondre à ce message

Sujets en rapport avec ce message

Création d'un client IRC,reception ok, emission: pas bon [ par freekid ] Bonjour tout le monde,je bosse actuellement sur la création d'un client IRC.Pour l'instant il s'agit d'un simple mode console.Et donc quand le program RECV() TELNET [ par kiki67100 ] Bonjour j'ai fait un serveur en c++ Mais le probleme c'est que mon code lit le recv() de telnet caractere par caractere et moi je voudrais phrase par C++ Serveur web [ par kiki67100 ] Bonjour J'ai commencé a faire un serveur Pour affiché du texte sur le client Voici le code#include #include #include #include c<br téléchargement d'un fichier via l'url [WINSOCK] [ par MorbhAck ] Bonsoir tout le monde!j'ai un problème, j'essai de télécharger un fichier .rar avec GETet quand je veux extraire le rar il m'indique que le fichier es Recuperer contenu requete http [ par fredsor ] Bonjour, Je voudrais me connecter a mon serveur local afin de recuperer le contenu par exemple d'un fichier txt.Grace a un code trouvé sur le site, j' Rhaaaa Requete Post http [ par fredsor ] Salut a tous, Desolé pour ce cri primaire, mais je comprends pas pourquoi ca ne marche pas...Voici ma la requete que je send : char canal[200];WSADATA socket trop lents [ par cid7777777 ] bonjour,jessaye de faire un jeu qui peu se jouera 2 en reseau local.je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver Connexion SOCKET_ERROR [ par fredsor ] 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 n Bind echouant.. [ par lektrosonic ] Bonsoir, deux applications, bon pour etre original: serveur et client.Chacune de leur cote effectue ce code:Serveur:----------------------   if(WSASta


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,156 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales