[C]Problème de socket.

Problème de socket. [C] - C - Programmation

Marsh Posté le 01-08-2006 à 22:18:10    

Bonjour a tous,
 
J'ai créer un client et un serveur pour découvrir la librairie winsock2.
 
Voici les codes :
 
Client :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4. #include <string.h>
  5. int main(int argc, char *argv[])
  6. {
  7.   int continuer=1,port=0;
  8.   char commande[102]={0},recu[10002],adresse[17]={0};
  9.   printf("Bienvenue !\n\nPort : " );
  10.   scanf("%ld",&port);
  11.   printf("Adresse ip : " );
  12.   scanf("%s",adresse);
  13.   printf("\nCoordonnees : %s:%ld\n\n",adresse,port);
  14.   printf("-Initialisation : " );
  15.  
  16.   WSADATA wsa;
  17.   WSAStartup(MAKEWORD(2,0), &wsa);
  18.  
  19.   printf("OK\n" );
  20.   printf("-Creation du socket : " );
  21.  
  22.   SOCKET sock;
  23.   SOCKADDR_IN struct_sock;
  24.   struct_sock.sin_addr.s_addr=inet_addr(adresse);
  25.   struct_sock.sin_family=AF_INET;
  26.   struct_sock.sin_port=htons(port);
  27.   sock=socket(AF_INET,SOCK_STREAM,0);
  28.   bind(sock,(SOCKADDR *)&struct_sock, sizeof(struct_sock));
  29.  
  30.   printf("OK\n" );
  31.   printf("-Connexion au serveur : " );
  32.  
  33.   connect(sock, (SOCKADDR *)&struct_sock, sizeof(struct_sock));
  34.  
  35.   printf("OK\n\n\n" );
  36.  
  37.   while(continuer==1){
  38.      printf("Commande : " );
  39.      scanf("%s",commande);
  40.      strcat(commande,"\r\n" );
  41.      send(sock, commande, strlen(commande), 0);
  42.      recv(sock, recu, sizeof(recu), 0);
  43.      printf("Serveur a repondu : \"%s\"\n",recu);
  44.    
  45.   }
  46.   closesocket(sock);
  47.   WSACleanup();
  48.   getchar();
  49.   return 0;
  50. }


 
Serveur :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4. #include <string.h>
  5. int main(int argc, char *argv[])
  6. {
  7.   int taille=0;
  8.   char phrase[]="Bienvenu, ca marche :) \r\n",recu[1000]={0};
  9.  
  10.   printf("Connexion : " );
  11.  
  12.   WSADATA wsa;
  13.   WSAStartup(MAKEWORD(2,0), &wsa);
  14.  
  15.   SOCKET sock,sockexe;
  16.   SOCKADDR_IN struct_sock,struct_sockexe; //les new var qui finissent par exe concerne le client.
  17.   sock=socket(AF_INET, SOCK_STREAM, 0);
  18.   struct_sock.sin_addr.s_addr=INADDR_ANY;
  19.   struct_sock.sin_family=AF_INET;
  20.   struct_sock.sin_port=htons(3768);
  21.   bind(sock,(SOCKADDR *)&struct_sock, sizeof(struct_sock));
  22.    
  23.   listen(sock, 0);
  24.  
  25.   printf("OK\n" );
  26.    
  27.   while(1){
  28.      taille=sizeof(struct_sockexe);//On met la taille de la structure dans une variable qu'on transmetra a la fonction.
  29.      sockexe=accept(sock,(SOCKADDR *)&struct_sockexe, &taille);
  30.      if(sockexe!=INVALID_SOCKET){
  31.         send(sockexe,phrase,strlen(phrase),0);
  32.         recv(sock, recu, sizeof(recu), 0);
  33.         printf("%s",recu);
  34.      }
  35.   }
  36.  
  37.   closesocket(sock);
  38.   WSACleanup();
  39.   getchar();
  40.   return 0;
  41. }


 
Je démarre le serveur, puis le client. Une fois le client connecté, il recoit un p'tit message de la part du serv, mais le problème c'est que en principe si j'appuie sur entrée une 2eme fois (sur le client bien sur) , mon serveur refuse de renvoyer le message de bienvenu.
 
Pour ceux qui ne comprendrait pas, je vous donne le lien de mes 2 programmes : http://antibatch.free.fr/client+serv.rar
 
il suffit d'executer d'abord serveur, puis client où il faudra remplir port par 3768 et adresse ip par 127.0.0.1 .
 
merci de m'aider
 
+

Reply

Marsh Posté le 01-08-2006 à 22:18:10   

Reply

Marsh Posté le 01-08-2006 à 23:59:28    

Yoshitu a écrit :


Je démarre le serveur, puis le client. Une fois le client connecté, il recoit un p'tit message de la part du serv, mais le problème c'est que en principe si j'appuie sur entrée une 2eme fois (sur le client bien sur) , mon serveur refuse de renvoyer le message de bienvenu.


C'est fou ce que les gens ont du mal avec les format adresses/longueur... C'est toujours le même problème :  
 
Ceci :  
 

Code :
  1. char recu[10002];
  2. <...>
  3.     recv(sock, recu, sizeof(recu), 0);
  4.     printf("Serveur a repondu : \"%s\"\n",recu);


ne fonctionne pas.
 
recv() retourne le nombre d'octets reçus, donc on doit faire :  

Code :
  1. size_t n = recv (sock, recu, sizeof recu - 1, 0);
  2.    if (n > 0)
  3.    {
  4.       recu[n] = 0;
  5.       printf("Serveur a repondu : \"%s\"\n",recu);
  6.    }


c'est quand même pas compliqué. Et je ne veux pas de complainte du genre "je suis un pauvre débutant en C". Mes fesses ! Un débutant en C ne fait pas de sockets. Il commence par apprendre et maitriser le C.
 
Non mais. http://mapage.noos.fr/emdel/reseaux.htm


Message édité par Emmanuel Delahaye le 02-08-2006 à 00:05:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-08-2006 à 00:16:44    

Ah je suis content, je m'attendais a avoir une reponse du fameux -ed- que ce soit sur le sdz ou ici !
 
En fait, j'ai merdé a cet endroit a cause d'un tutau qui m'as parut un peu d'ailleurs suspect.
 
J'ai fait ce que tu m'as dit mais ca marche pas plus.


Message édité par Yoshitu le 02-08-2006 à 00:24:26
Reply

Sujets relatifs:

Leave a Replay

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