Probléme avec les socket en C

Probléme avec les socket en C - C - Programmation

Marsh Posté le 04-07-2013 à 15:23:39    

Bonjour,
je suis en stage et je doit programmer deux programmes qui s'envoie des information. J'utilise des socket pour cela.  
je ne comprend pas se qui ne vas pas avec mon code.  
 
j'ai deux programme  
test1-e.c et test1-r.c
test1-e.c est le serveur, c'est lui qui envoi la string "bonjour le monde"  
test1-r.c est le client, il doit la recevoir et l'afficher.
Premier problème:  le client ne rassoit rien  
Deuxième problème:  les socket et port ne sont pas fermer à la fin de l'exécution du programme alors qu'il y a les instruction .
(une partie du code viens du site du zéro )
 
test1-e.c:

Code :
  1. #if defined (WIN32)
  2.     #include <winsock2.h>
  3.     typedef int socklen_t;
  4. #elif defined (linux)
  5.     #include <sys/types.h>
  6.     #include <sys/socket.h>
  7.     #include <netinet/in.h>
  8.     #include <arpa/inet.h>
  9.     #include <unistd.h>
  10.     #define INVALID_SOCKET -1
  11.     #define SOCKET_ERROR -1
  12.     #define closesocket(s) close(s)
  13.     typedef int SOCKET;
  14.     typedef struct sockaddr_in SOCKADDR_IN;
  15.     typedef struct sockaddr SOCKADDR;
  16. #endif
  17. #include <string.h> 
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #define PORT 1024
  21.  
  22.  
  23.  
  24. int main(void)
  25. {
  26.     #if defined (WIN32)
  27.         WSADATA WSAData;
  28.         int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
  29.     #else
  30.         int erreur = 0;
  31.     #endif
  32.    
  33.     /* Socket et contexte d'adressage du serveur */
  34.     SOCKADDR_IN sin;
  35.     SOCKET sock;
  36.     socklen_t recsize = sizeof(sin);
  37.    
  38.     /* Socket et contexte d'adressage du client */
  39.     SOCKADDR_IN csin;
  40.     SOCKET csock;
  41.     socklen_t crecsize = sizeof(csin);
  42.    
  43.     int sock_err;
  44.    
  45.    
  46.     if(!erreur)
  47.     {
  48.         /* Création d'une socket */
  49.           sock = socket(AF_INET,SOCK_STREAM, 0);
  50.        
  51.         /* Si la socket est valide */
  52.         if(sock != INVALID_SOCKET)
  53.         {
  54.             printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
  55.            
  56.             /* Configuration */
  57.             sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
  58.             sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
  59.             sin.sin_port = htons(PORT);               /* Listage du port */
  60.             sock_err = bind(sock, (SOCKADDR*)&sin, recsize);
  61.            
  62.             /* Si la socket fonctionne */
  63.             if(sock_err != SOCKET_ERROR)
  64.             {
  65.                 /* Démarrage du listage (mode server) */
  66.                 sock_err = listen(sock, 5);
  67.                 printf("Listage du port %d...\n", PORT);
  68.                
  69.                 /* Si la socket fonctionne */
  70.                 if(sock_err != SOCKET_ERROR)
  71.                 {
  72.                     /* Attente pendant laquelle le client se connecte */
  73.                     printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
  74.                     csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
  75.                     printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
  76.                 }
  77.                 else
  78.                     perror("listen" );
  79.             }
  80.             else
  81.                 perror("bind" );
  82.     char * a[1];
  83.     a[0]=malloc(sizeof("bonjour le monde" ));
  84.     strcpy(a[0],"bonjour le monde" );
  85.    if(send( sock,a[0],strlen(a[0])+1,0)!=SOCKET_ERROR)
  86.    {
  87.     printf("%d\n", strlen(a[0]));
  88.     printf("envoi de %s\n",a[0]);
  89.    }
  90.    else
  91.      perror("envoi" );
  92.             /* Fermeture de la socket client et de la socket serveur */
  93.             printf("Fermeture de la socket client\n" );
  94.             closesocket(csock);
  95.             printf("Fermeture de la socket serveur\n" );
  96.             closesocket(sock);
  97.             printf("Fermeture du serveur terminée\n" );
  98.         }
  99.         else
  100.             perror("socket" );
  101.        
  102.         #if defined (WIN32)
  103.             WSACleanup();
  104.         #endif
  105.     }
  106.    
  107.     return EXIT_SUCCESS;
  108. }


 
test1-r.c

Code :
  1. #include <stdio.h> 
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <math.h>
  6. #ifndef LIB
  7. #include <sys/types.h>
  8.     #include <sys/socket.h>
  9.     #include <netinet/in.h>
  10.     #include <arpa/inet.h>
  11.     #include <unistd.h>
  12.     // Define, qui nous serviront par la suite
  13.     #define INVALID_SOCKET -1
  14.     #define SOCKET_ERROR -1
  15.     #define closesocket(s) close (s)
  16.     // De même
  17.     typedef int SOCKET;
  18.     typedef struct sockaddr_in SOCKADDR_IN;
  19.     typedef struct sockaddr SOCKADDR;
  20. #endif
  21. #define PORT 1024
  22. #include <string.h>
  23. int main(void)
  24. {
  25.         int erreur = 0;
  26.  
  27.     SOCKET sock;
  28.     SOCKADDR_IN sin;
  29.  
  30.     if(!erreur)
  31.     {
  32.         /* Création de la socket */
  33.         sock = socket(AF_INET,SOCK_STREAM, 0);
  34.  
  35.         /* Configuration de la connexion */
  36.         sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  37.         sin.sin_family = AF_INET;
  38.         sin.sin_port = htons(PORT);
  39.  
  40.         /* Si le client arrive à se connecter */
  41.         if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
  42.             printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
  43.         else
  44.             printf("Impossible de se connecter\n" );
  45.    
  46. char* resu_a[1];
  47. resu_a[0]=malloc(1024*sizeof(char));
  48. if(recv(sock,resu_a[0],strlen(resu_a[0]),0)!= SOCKET_ERROR)
  49.   printf(" recu: %s\n",resu_a[0]);
  50. else
  51.   printf("nous navons rien ressu\n" );
  52.         /* On ferme la socket précédemment ouverte */
  53.         closesocket(sock);
  54.  
  55.         #if defined (WIN32)
  56.             WSACleanup();
  57.         #endif
  58.     }
  59.  
  60.   return 0;
  61. }

Reply

Marsh Posté le 04-07-2013 à 15:23:39   

Reply

Marsh Posté le 04-07-2013 à 19:02:00    

La socket TCP qui contient la connexion avec le client est la valeur retournée par connect() au niveau du serveur. Tu utilises la socket qui écoute sur le port 1024 pour envoyer le message. Une fois la connexion effectuée par le client, une nouvelle socket est créée, en utilisant un port +/- aléatoire. Bref remplace cette ligne:

Code :
  1. if(send( sock,a[0],strlen(a[0])+1,0)!=SOCKET_ERROR)


Par:

Code :
  1. if(send( csock,a[0],strlen(a[0])+1,0)!=SOCKET_ERROR)


 
Edit: accessoirement la ligne 53 de ton client est casse gueule :

Code :
  1. if(recv(sock,resu_a[0],strlen(resu_a[0]),0)!= SOCKET_ERROR)


resu_a[0] pointe sur de la mémoire non initialisée, la valeur de strlen() est indéfinie (ie: attends toi à ce que ça crash).


Message édité par tpierron le 04-07-2013 à 19:03:56
Reply

Marsh Posté le 05-07-2013 à 11:14:54    

Merci Pour ta réponse tpierron  

Reply

Sujets relatifs:

Leave a Replay

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