[C/C++] Socket sous win

Socket sous win [C/C++] - Programmation

Marsh Posté le 15-06-2002 à 16:22:32    

bonjour,
 
j'essaye de m'initier aux socket (sous win).
Donc en fait ce que j'ai fait c'est 2 fonctions,
 
* une qui s'appelle client();, qui créé un socket puis qui l'utilise en tant que client.
* une qui s'appelle server();, qui créé un socket puis qui l'utilise en tant que server.
 
voici le code que ça donne :
 

Code :
  1. #include <winsock2.h>
  2. #pragma comment(lib, "ws2_32.lib" )
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <io.h>
  7. void server(int port)
  8. {
  9. WSADATA WSAData;
  10. WSAStartup(MAKEWORD(2,0), &WSAData);
  11. char *buff = new char[255];
  12. int sizeofsin;
  13. SOCKET val;
  14. SOCKADDR_IN sin;
  15. sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  16. sin.sin_family = AF_INET;
  17. sin.sin_port = htons(port);
  18. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  19. bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  20. int fich = open("c:\\test.ini", O_RDWR | O_TEXT); //Ouvre le fichier (charge en mémoire)
  21. lseek(fich, 0L, SEEK_SET); //Positionne le pointeur au début du fichier (SEEK_SET)
  22. listen(sock, 0);
  23. while(true)
  24. {
  25. sizeofsin = sizeof(sin);
  26. val = accept(sock, (SOCKADDR *)&sin, &sizeofsin);
  27. if(val != INVALID_SOCKET)
  28.   {
  29.   //je réceptionne dans 'buff' ce qui arrive dans mon port 80
  30.   recv(sock, buff, sizeof(buff), 0);
  31.   write(fich, buff, strlen(buff));
  32.   }
  33. }
  34. close(fich); //Ferme le fichier
  35. closesocket(sock);
  36. WSACleanup();
  37. }
  38. //------------------------------------------------
  39. ---------------------------
  40. void client(char *server, int port, char *msg, int lngmsg)
  41. {
  42. WSADATA WSAData;
  43. WSAStartup(MAKEWORD(2,0), &WSAData);
  44. SOCKADDR_IN sin;
  45. sin.sin_addr.s_addr = inet_addr(server);
  46. sin.sin_family = AF_INET;
  47. sin.sin_port = htons(port);
  48. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  49. bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  50. connect(sock, (SOCKADDR *)&sin, sizeof(sin));
  51. //j'envoie 'msg' sur le port 'port' de la machine 'server'
  52. send(sock, msg, lngmsg, 0);
  53. //
  54. closesocket(sock);
  55. WSACleanup();
  56. }


 
 
ensuite à partir de la fonction main(); j'appelle la fonction client(); ou server(); en passant les paramètres, l'IP et le
port de destination pour client, et juste le port d'écoute pour server();
Pour faire mes tests je lance netstat en ligne de commande.
 
Le client marche très bien, un server que j'ai pas codé reçoit les données envoyées...
Au fait question subsidiaire, comment choisir le port local pour l'envoi, actuellement c'est un port au hasard je crois.
 
Par contre le serveur marche pas, en le debuggant, il repete sans fin ce code :
 
while(true)
 {
 sizeofsin = sizeof(sin);
 if((val = accept(sock, (SOCKADDR *)&sin, &sizeofsin)) != INVALID_SOCKET)
 
Donc il considère toujours val comme un INVALID_SOCKET ...
A moins qu'il faille que ça valle INVALID_SOCKET pour que ça marche, non ?
 
Encore une question, comment faire une 3eme fonction, par exemple open_sock(); appelée par server(); ou client(); qui créé le socket ?
Quels paramètres et quelles valeur de retour je dois mettre ?
 
Merci de votre aide !
 
@++ :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 15-06-2002 à 16:22:32   

Reply

Marsh Posté le 15-06-2002 à 16:42:57    

:bounce:  
et aussi j'en profite pour dire que si je force en mettant "== INVALID_SOCKET", il reçoit en permanence ceci : "¤M?" (hexa : A44D95), qu'il écrit dans le fichier c:\test.ini ...
C'est koi ?
 
merci


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 15-06-2002 à 17:03:27    

Code :
  1. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  2. bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  3. ...
  4. listen(sock, 0);

Tu es sur à 100% qu'il n'y a pas d'erreur avec ces fonctions :heink:  
 
Le 'INVALID_SOCKET' signifie surement que le paramètre 'sock' n'est pas le descripteur d'une socket correctement créée et disponible.

Reply

Marsh Posté le 15-06-2002 à 18:06:08    

mrbebert a écrit a écrit :

Code :
  1. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  2. bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  3. ...
  4. listen(sock, 0);

Tu es sur à 100% qu'il n'y a pas d'erreur avec ces fonctions :heink:  
 
Le 'INVALID_SOCKET' signifie surement que le paramètre 'sock' n'est pas le descripteur d'une socket correctement créée et disponible.  




 
euh ... ben non pas 100 % mais ça devrait être ça, dans l'aide de bind, ce paramètre : The length of the name.
...
merci
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 15-06-2002 à 18:21:06    

juju_le_barbare a écrit a écrit :

 
 
euh ... ben non pas 100 % mais ça devrait être ça, dans l'aide de bind, ce paramètre : The length of the name.
...
merci
@++  



:ange:  
Vérifie les codes de retour des fonctions ;)

Reply

Marsh Posté le 16-06-2002 à 02:07:47    

mrbebert a écrit a écrit :

 :ange:  
Vérifie les codes de retour des fonctions ;)  




 
et bien justement j'ai bien regardé !
mais en fait le problème ne vient pas de bind je pense.
 
Regarde j'ai encore modifié, c'est la fonction serveur() qui merde donc :
 

Code :
  1. void serveur(int port)
  2. {
  3. //variable globale SOCKET sock;
  4. //variable globale AnsiString tmp;
  5. SOCKET val;
  6. SOCKADDR_IN sin;
  7. WSADATA WSAData;
  8. int sizeofsin;
  9. char *buff;
  10. if (WSAStartup(MAKEWORD(2,0), &WSAData))
  11. Form1->ListBox1->Items->Add("Impossible d'initialiser Winsock" );
  12. else
  13. {
  14. sin.sin_family = AF_INET;
  15. sin.sin_port = htons(port);
  16. if ((sin.sin_addr.s_addr = inet_addr("127.0.0.1" )) == INADDR_NONE)
  17.   {
  18.   tmp = "Impossible de trouver l'hôte 127.0.0.1 : ";
  19.   tmp = tmp + IntToStr(port);
  20.   Form1->ListBox1->Items->Add(tmp);
  21.   }
  22. else
  23.   {
  24.   if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
  25.    Form1->ListBox1->Items->Add("Erreur de socket" );
  26.   else
  27.    {
  28.    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  29.    while(true)
  30.     {
  31.     sizeofsin = sizeof(sin);
  32.     if((val = accept(sock, (SOCKADDR *)&sin, &sizeofsin)) == INVALID_SOCKET) //ICI il dit erreur sans fin
  33.      Form1->ListBox1->Items->Add("Erreur de socket" );
  34.     else
  35.      {
  36.      //je réceptionne dans 'buff' ce qui arrive dans mon port 80
  37.      recv(sock, buff, sizeof(buff), 0);
  38.      //
  39.      }
  40.    }
  41.    Form1->ListBox1->Items->Add("Déconnexion" );
  42.    closesocket(sock);
  43.    WSACleanup();
  44.    }
  45.   }
  46. }
  47. }


 
j'ai mis l'erreur en commentaire. En fait faudrait que je marcque != INVALID_SOCKEt, et là il dirait pas invalid socket mais le soft freeze dans les 2 cas de toute façon...
 
au fait pour la partie client j'ai vu un source ainsi :
 
struct hostent *he;
...
memset((char *)&blah, 0, sizeof(blah));
...
if ((he = gethostbyname(server)) != NULL)
 memcpy((char *)&blah.sin_addr, he->h_addr, he->h_length);
...
 
et lorsqu'il y a ces istructions on peut marquer le nom de l'ordi à la place de l'IP et ça marche (mais j'ai pas réussi à l'inclure dans mon code du client on verra plus tard)
c'est quoi exactement ?
 
merci :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-06-2002 à 08:43:51    

deja tu fait un recv sur sock alors que sock est ta socket qui recoi les connexions. il faut que tu fasse recv sur la socket val. kan ton client se connecte a ton serveur, accept et sencé accepté et retourne une socket qui permet de dialoguer avec le client.
 
 

Code :
  1. SOCKET creerServeurSocketTcp (const char*add)
  2. {
  3.  SOCKET ss=socket(AF_INET, SOCK_STREAM, 0);
  4.      if (ss==INVALID_SOCKET)
  5.       {
  6.   msgBox("Impossible de créer la socket TCP." );
  7.   return INVALID_SOCKET;
  8.      }
  9.       //pour que l'on puisse réutiliser la socket
  10.       int enable=1;
  11.      if (setsockopt (ss, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int)))
  12.       {
  13.          closesocket(ss);
  14.          msgBox("Impossible de spécifier SO_REUSEADDR sur la socket TCP." );
  15.        return INVALID_SOCKET;
  16.      }
  17.       //affectation a une addresse
  18.       struct sockaddr_in addresse;
  19.      addresse.sin_family=AF_INET;
  20.      addresse.sin_port=htons(doc.getPortEcouteTCP());
  21.       if (add==NULL)             // faut éviter d'utiliser INADDR_ANY
  22.        addresse.sin_addr.s_addr=htonl(INADDR_ANY);
  23.       else
  24.        addresse.sin_addr.s_addr=inet_addr (add);
  25.      if (bind (ss, (sockaddr*)&addresse, sizeof(struct sockaddr_in))==SOCKET_ERROR)
  26.       {
  27.       closesocket(ss);
  28.        msgBox("Impossible d'associer la socket TCP a une addresse." );
  29.        return INVALID_SOCKET;
  30.      }
  31.       // mise en écoute de la socket
  32.       if (listen (ss, 5)==SOCKET_ERROR)
  33.       {
  34.        closesocket(ss);
  35.          msgBox("Erreure sur listen avec la socket TCP." );
  36.          return INVALID_SOCKET;
  37.      }
  38.       return ss;
  39. }


 
voila un exemple, après ca tu peu effectivement faire ton accept (si ca tourne en boucle c surement que ta po fait de listen)

Reply

Marsh Posté le 16-06-2002 à 09:15:42    

sanglier04 a écrit a écrit :

deja tu fait un recv sur sock alors que sock est ta socket qui recoi les connexions. il faut que tu fasse recv sur la socket val. kan ton client se connecte a ton serveur, accept et sencé accepté et retourne une socket qui permet de dialoguer avec le client.
 
 

Code :
  1. SOCKET creerServeurSocketTcp (const char*add)
  2. {
  3. ...
  4. }


 
voila un exemple, après ca tu peu effectivement faire ton accept (si ca tourne en boucle c surement que ta po fait de listen)  




 
j'analyse tout ça, merci !!!
 
@++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-06-2002 à 12:56:26    

salut,
 
en m'inspirant très fortement sur ton code, voici ce que j'ai fait :
 

Code :
  1. void connexion_serveur(int port)
  2. {
  3. //variable globale AnsiString g_tmp;
  4. //variables globale SOCKET g_sock_srv;
  5. SOCKADDR_IN sin;
  6. SOCKET sock;
  7. WSADATA WSAData;
  8. if (WSAStartup(MAKEWORD(2,0), &WSAData))
  9. {
  10. Form1->ListBox1->Items->Add("Impossible d'initialiser Winsock" );
  11. closesocket(g_sock_srv);
  12. g_srv_cnt = false;
  13. }
  14. else
  15. {
  16. if ((g_sock_srv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
  17.   {
  18.   Form1->ListBox1->Items->Add("Erreur de socket" );
  19.   closesocket(g_sock_srv);
  20.   g_srv_cnt = false;
  21.   }
  22. else
  23.   {
  24.   int enable=1;
  25.   if (setsockopt (g_sock_srv, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int)))
  26.    {
  27.    Form1->ListBox1->Items->Add("Impossible de spécifier SO_REUSEADDR sur la socket TCP" );
  28.    closesocket(g_sock_srv);
  29.    g_srv_cnt = false;
  30.    }
  31.   else
  32.    {
  33.    sin.sin_family = AF_INET;
  34.    sin.sin_port = htons(port);
  35.    if ((sin.sin_addr.s_addr = inet_addr("127.0.0.1" )) == INADDR_NONE)
  36.     {
  37.     g_tmp = "Impossible de trouver l'hôte 127.0.0.1 : ";
  38.     g_tmp = g_tmp + IntToStr(port);
  39.     Form1->ListBox1->Items->Add(g_tmp);
  40.     closesocket(g_sock_srv);
  41.     g_srv_cnt = false;
  42.     }
  43.    else
  44.     {
  45.     if ((bind(g_sock_srv, (SOCKADDR *)&sin, sizeof(sin))) == SOCKET_ERROR)
  46.      {
  47.      Form1->ListBox1->Items->Add("Impossible d'associer la socket TCP a une addresse" );
  48.      closesocket(g_sock_srv);
  49.      g_srv_cnt = false;
  50.      }
  51.     else
  52.      {
  53.      if (listen(g_sock_srv, SOMAXCONN) == SOCKET_ERROR)
  54.       {
  55.       Form1->ListBox1->Items->Add("Erreur sur listen avec la socket TCP" );
  56.       closesocket(g_sock_srv);
  57.       g_srv_cnt = false;
  58.       }
  59.      else
  60.       g_srv_cnt = true;
  61.      }
  62.     }
  63.    }
  64.   }
  65. }
  66. }


 
a priori le code s'exécute bien, mais comment faire pour par exemple afficher dans ListBox1 (Form1->ListBox1->Items->Add()) le contenu de ce qu'il reçoit ???
 

Code :
  1. void reception_serveur()
  2. {
  3. char *buff = new char[255];
  4. recv(g_sock_srv, buff, sizeof(buff), 0);
  5. Form1->ListBox1->Items->Add(buff));
  6. }


 
ne fait rien ... meme avec netstat ça fait rien ... merci
 
merci de votre aide  :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-06-2002 à 14:32:43    

maintenant que ta cré ta socket serveur tu lui dit d'attendre des connexion : accept (g_sock_srv...); puis a chaque fois qu'un client vas se connecter accept vas te retourner une socket connecté a ce client et la ta plus ka faire un recv sur la socket que vien de te renvoyer accept

Reply

Marsh Posté le 16-06-2002 à 14:32:43   

Reply

Marsh Posté le 16-06-2002 à 14:48:50    

sanglier04 a écrit a écrit :

maintenant que ta cré ta socket serveur tu lui dit d'attendre des connexion : accept (g_sock_srv...); puis a chaque fois qu'un client vas se connecter accept vas te retourner une socket connecté a ce client et la ta plus ka faire un recv sur la socket que vien de te renvoyer accept  




 :jap: je teste merci, vraiment !


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-06-2002 à 16:16:39    

salut,
 
et bien j'ai modifié le code ainsi, il y a 2 fonctions, connexion_serveur() et reception_serveur().
Pour utiliser ce code, j'appelle ces 2 fonctions succéssivement. La suite après le code...
 

Code :
  1. void connexion_serveur(int port)
  2. {
  3. //variable globale AnsiString g_tmp;
  4. //variables globale SOCKET g_sock_srv;
  5. //variable globale bool g_srv_cnt;
  6. SOCKADDR_IN sin;
  7. SOCKET sock;
  8. WSADATA WSAData;
  9. if (WSAStartup(MAKEWORD(2,0), &WSAData))
  10. {
  11. Form1->ListBox1->Items->Add("srv : Impossible d'initialiser Winsock" );
  12. closesocket(g_sock_srv);
  13. g_srv_cnt = false;
  14. }
  15. else
  16. {
  17. if ((g_sock_srv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
  18.   {
  19.   Form1->ListBox1->Items->Add("srv : Erreur de socket" );
  20.   closesocket(g_sock_srv);
  21.   g_srv_cnt = false;
  22.   }
  23. else
  24.   {
  25.   int enable=1;
  26.   if (setsockopt (g_sock_srv, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int)))
  27.    {
  28.    Form1->ListBox1->Items->Add("srv : Impossible de spécifier SO_REUSEADDR sur la socket TCP" );
  29.    closesocket(g_sock_srv);
  30.    g_srv_cnt = false;
  31.    }
  32.   else
  33.    {
  34.    sin.sin_family = AF_INET;
  35.    sin.sin_port = htons(port);
  36.    if ((sin.sin_addr.s_addr = inet_addr("127.0.0.1" )) == INADDR_NONE)
  37.     {
  38.     g_tmp = "srv : Impossible de trouver l'hôte 127.0.0.1 : ";
  39.     g_tmp = g_tmp + IntToStr(port);
  40.     Form1->ListBox1->Items->Add(g_tmp);
  41.     closesocket(g_sock_srv);
  42.     g_srv_cnt = false;
  43.     }
  44.    else
  45.     {
  46.     if ((bind(g_sock_srv, (SOCKADDR *)&sin, sizeof(sin))) == SOCKET_ERROR)
  47.      {
  48.      Form1->ListBox1->Items->Add("srv : Impossible d'associer la socket TCP a une addresse" );
  49.      closesocket(g_sock_srv);
  50.      g_srv_cnt = false;
  51.      }
  52.     else
  53.      {
  54.      if (listen(g_sock_srv, SOMAXCONN) == SOCKET_ERROR)
  55.       {
  56.       Form1->ListBox1->Items->Add("srv : Erreur sur listen avec la socket TCP" );
  57.       closesocket(g_sock_srv);
  58.       g_srv_cnt = false;
  59.       }
  60.      else
  61.       {
  62.       g_tmp = "srv : Connecté sur le port ";
  63.       g_tmp = g_tmp + IntToStr(port);
  64.       Form1->ListBox1->Items->Add(g_tmp);
  65.       Form1->Button4->Enabled = false;
  66.       Form1->Button1->Enabled = true;
  67.       Form1->Button5->Enabled = true;
  68.       Form1->Memo2->Enabled = true;
  69.       Form1->ActiveControl = Form1->Memo2;
  70.       g_srv_cnt = true;
  71.       }
  72.      }
  73.     }
  74.    }
  75.   }
  76. }
  77. }
  78. //---------------------------------------------------------------------------
  79. SOCKADDR_IN sin;
  80. SOCKET tmp;
  81. char *buff = new char[255];
  82. int sizeofsin = sizeof(sin);
  83. if (tmp = accept(g_sock_srv, (SOCKADDR *)&sin, &sizeofsin) == INVALID_SOCKET)
  84. Form1->ListBox1->Items->Add("srv : Erreur de socket" );
  85. else
  86. {
  87. Form1->ListBox1->Items->Add("srv : Ecoute activée" );
  88. while (g_srv_cnt)
  89.   {
  90.   if (recv(tmp, buff, sizeof(buff), MSG_OOB) != SOCKET_ERROR) //ICI RENVOIE TOUJOURS SOCKET_ERROR
  91.    Form1->Memo2->Lines->Add("srv : Erreur de réception" );
  92.   else
  93.    Form1->Memo2->Lines->Add(buff);
  94.   }
  95. }
  96. Form1->ListBox1->Items->Add("srv : Vous n'êtes pas connecté" );
  97. }


 
 
Avec ce code, il est déjà à noter que vers la fin, où je l'ai indiqué en commentaires, j'ai du inverser le test, à priori la
fonction recv() renvoie toujours SOCKET_ERROR.
Mais ensuite après l'inversion le serveur est bien en écoute, lorsque je lance les 2 fonctions ainsi :
 

Code :
  1. connexion_serveur("80" );
  2. reception_serveur();


 
et bien il attend, rien n'est écrit dans Form1->Memo2
Donc pour tester, je lance un client (ça j'y arrive parfaitement à le faire), et lorsque je me connecte sur 127.0.0.1:80, hop le
serveur écrit "(&?" (ou bien d'autres signes ...) dans Form1->Memo2 à l'infini (logique vu que c'est while(true)), mais
je m'en fous de ces signes, j'aimerais recevoir ce que le client envoie (le client connecté à beau envoyer des données, le serveur
continue toujours d'afficher sans fin ces signes...).
Par contre si je deconnecte le client, je sais pas si il continue d'afficher les signes, mais ça freeze ...
 
Comment faire pour qu'il ne reçoive plus ceux-ci, et qu'il écoute en permanence pour recevoir les caractères envoyés par un client
à la place des signes ?
 
Merci d'avance à vous :hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 16-06-2002 à 16:50:52    

Pourquoi MSG_OOB dans les paramètres du recv :??:  
Essaie en mettant simplement 0.

Reply

Marsh Posté le 17-06-2002 à 12:21:53    

mrbebert a écrit a écrit :

Pourquoi MSG_OOB dans les paramètres du recv :??:  
Essaie en mettant simplement 0.  




merci m'sieur bebert, je teste ça le plus vite possible !


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 17-06-2002 à 14:15:13    

juju_le_barbare a écrit a écrit :

 
merci m'sieur bebert, je teste ça le plus vite possible !  



Fais attention aussi au type de données transférées. Ce qui est envoyé, c'est une suite d'octets. Rien ne dit que ce sera un chaine de caractère valable (avec un 0 à la fin).
Que se passe t'il avec le Form1->Memo2->Lines->Add(buff) si il n'y a pas une chaine correcte dans buff ? Essaie de mettre les 256 octets de buff à '\0' avant chaque recv pour être sur de ne pas avoir de problème à ce niveau là.


Message édité par mrbebert le 17-06-2002 à 14:17:44
Reply

Marsh Posté le 17-06-2002 à 22:10:43    

mrbebert a écrit a écrit :

Fais attention aussi au type de données transférées. Ce qui est envoyé, c'est une suite d'octets. Rien ne dit que ce sera un chaine de caractère valable (avec un 0 à la fin).
Que se passe t'il avec le Form1->Memo2->Lines->Add(buff) si il n'y a pas une chaine correcte dans buff ? Essaie de mettre les 256 octets de buff à '\0' avant chaque recv pour être sur de ne pas avoir de problème à ce niveau là.  




 
Et bien voici la nouvelle fonction d'écoute du socket :
 

Code :
  1. void reception_serveur()
  2. {
  3. SOCKADDR_IN sin;
  4. SOCKET tmp;
  5. char *buff = new char[255];
  6. for (int i=0; i<255; i++)
  7. buff[i] = '\0';
  8. int sizeofsin = sizeof(sin);
  9. if (tmp = accept(g_sock_srv, (SOCKADDR *)&sin, &sizeofsin) == INVALID_SOCKET)
  10. Form1->ListBox1->Items->Add("srv : Erreur de socket" );
  11. else
  12. {
  13. Form1->ListBox1->Items->Add("srv : Ecoute activée" );
  14. while (g_srv_cnt)
  15.   {
  16.   if (recv(tmp, buff, 255, 0) != SOCKET_ERROR) //ICI RENVOIE TOUJOURS SOCKET_ERROR
  17.    Form1->Memo2->Lines->Add("srv : Erreur de réception" );
  18.   else
  19.    Form1->Memo2->Lines->Add(buff);
  20.   }
  21. }
  22. Form1->ListBox1->Items->Add("srv : Vous n'êtes pas connecté" );
  23. }


 
Donc au lieu d'afficher les signes bizarres, ça affiche sans fin rien... mais des lignes s'ajoutent...
Je comprends pas même quans le client connecté dessus envoie rien le serveur dit qu'il reçoit toujours qqchose ... mais du vide en fait ! En plus le soft bloque ...
 
Merci de votre temps que vous me consacrez ;)
 
@++
 
:hello:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 17-06-2002 à 22:15:07    

juju_le_barbare a écrit a écrit :

 
 
Et bien voici la nouvelle fonction d'écoute du socket :
 

Code :
  1. void reception_serveur()
  2. {
  3. SOCKADDR_IN sin;
  4. SOCKET tmp;
  5. char *buff = new char[255];
  6. for (int i=0; i<255; i++)
  7. buff[i] = '\0';
  8. int sizeofsin = sizeof(sin);
  9. if (tmp = accept(g_sock_srv, (SOCKADDR *)&sin, &sizeofsin) == INVALID_SOCKET)
  10. Form1->ListBox1->Items->Add("srv : Erreur de socket" );
  11. else
  12. {
  13. Form1->ListBox1->Items->Add("srv : Ecoute activée" );
  14. while (g_srv_cnt)
  15.   {
  16.   if (recv(tmp, buff, 255, 0) != SOCKET_ERROR) //ICI RENVOIE TOUJOURS SOCKET_ERROR
  17.    Form1->Memo2->Lines->Add("srv : Erreur de réception" );
  18.   else
  19.    Form1->Memo2->Lines->Add(buff);
  20.   }
  21. }
  22. Form1->ListBox1->Items->Add("srv : Vous n'êtes pas connecté" );
  23. }


 
Donc au lieu d'afficher les signes bizarres, ça affiche sans fin rien... mais des lignes s'ajoutent...
Je comprends pas même quans le client connecté dessus envoie rien le serveur dit qu'il reçoit toujours qqchose ... mais du vide en fait ! En plus le soft bloque ...
c'est peut-être parcequ'il renvoie SOCKET_ERROR mais que j'ai inversé le saut ? Mais dans ce cas pourquoi renvoie-t-il SOCKET_ERROR ?
Telle est l'interrogation principale ;)
 
 
Merci de votre temps que vous me consacrez ;)
 
@++
 
:hello:  




---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 18-06-2002 à 20:37:03    

Quand recv renvoie SOCKET_ERROR, affiche le résultat de WSAGetLastError() pour savoir quel est le problème.
Certaines 'erreurs' n'en sont pas vraiment, par exemple :
- WSAEWOULDBLOCK : il n'y a pas de données à lire mais, la socket n'étant pas bloquante, la fonction retourne quand même

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed