[C] une messagerie instantanée simple

une messagerie instantanée simple [C] - C - Programmation

Marsh Posté le 03-05-2006 à 21:42:08    

Bonjour,
 
Je ne souhaite pas concurence msn messenger et les autres mais juste apprendre le langage C.
J'ai déjà programmé quelques programmes simpliste et là je m'attaque aux sockets avec cette appli dont voici le code source
 
Serveur :

Code :
  1. /* Simple chat v 1.0    */
  2. /* by thechief          */               
  3. /* SERVER               */
  4. #include <stdio.h>
  5. #include <winsock2.h>
  6. #include <string.h>
  7.              
  8. main(void)
  9. {
  10.       printf("Simple Chat server v 1.0\n" );
  11.       printf("see www.kilhwch.info for questions \n\n" );
  12.      
  13.       WSADATA WSAData; // Initialisation des variables
  14.       int start_wsa;
  15.      
  16.       int serveur_socket, client_socket;
  17.       struct sockaddr_in  ip_serveur, ip_client;
  18.       int port = 1000;
  19.       int ip_serveur_size;
  20.      
  21.       int envoyer, recevoir;
  22.       char buffer_send[512];
  23.       char buffer_recv[512];
  24.      
  25.      
  26.       if((start_wsa = WSAStartup(MAKEWORD(2,0), &WSAData)) != 0) {  // Initialisation de la dll Winsock
  27.               printf("Erreur : Initialisation de winsock impossible \n" );
  28.               return 0; // Si erreur fin d'éxécution du programme
  29.               }
  30.      
  31.       memset(&ip_serveur, 0, sizeof(ip_serveur)); // Met la structure à zéro  
  32.      
  33.       ip_serveur.sin_family = AF_INET; // socket family       
  34.       ip_serveur.sin_addr.s_addr = htonl(INADDR_ANY); //Adresse IP (any = server)
  35.       ip_serveur.sin_port = htons(port); //Port
  36.            
  37.              
  38.       if((serveur_socket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){ // Création de la socket
  39.               printf("Erreur : Creation de la  socket impossible \n" );
  40.               return 0; // Si erreur fin d'éxécution du programme
  41.               }
  42.      
  43.            
  44.       bind(serveur_socket, (struct sockaddr *)&ip_serveur, sizeof(ip_serveur));     // On lie le socket     
  45.      
  46.       listen(serveur_socket, 0); // Ecoute sur le port voulu
  47.      
  48.       ip_serveur_size = sizeof(ip_client);
  49.            
  50.       if((client_socket = accept(serveur_socket,
  51.                          (struct sockaddr *)&ip_client,
  52.                          &ip_serveur_size)) == -1) { // Connexion avec le client
  53.                printf("Erreur : Connexion avec le client impossible\n" );
  54.                return 0;
  55.                }
  56.      
  57.       printf("Connecte a l'hote\n" );
  58.       printf("Tapez votre message\n\n" );
  59.      
  60.       int c;
  61.       while ((c = getchar()) != '\n' && c != EOF); /* purge du tampon */             
  62.        
  63.       while(serveur_socket != INVALID_SOCKET)
  64.       {
  65.      
  66.       fgets(buffer_send, sizeof(buffer_send), stdin);
  67.      
  68.       if ((envoyer = send(client_socket, buffer_send, strlen(buffer_send), 0)) != strlen(buffer_send)){ // Envoyer les données
  69.          printf("Erreur : Envois des donnees impossible\n" );
  70.          return 0;
  71.          }
  72.        
  73.       if(( recevoir =  recv(client_socket, buffer_recv,512,0)) != SOCKET_ERROR) // Reception des données
  74.            {
  75.                   printf("%s\n", buffer_recv);
  76.            } 
  77.      
  78.      
  79.       }
  80.      
  81.       shutdown(client_socket, 2);
  82.       shutdown(serveur_socket, 2);
  83.       close(serveur_socket, 2);
  84.       WSACleanup();
  85.       return 0;
  86. }


 
et le client :

Code :
  1. /* Simple chat v 1.0    */
  2. /* by thechief          */               
  3. /* CLIENT               */
  4. #include <winsock2.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. main(void) {
  8.          
  9.       printf("Simple Chat client v 1.0\n" );
  10.       printf("see www.kilhwch.info for questions \n\n" );
  11.                
  12.       WSADATA WSAData; //initiation des variables
  13.       int start_wsa;
  14.      
  15.       int socket_c;
  16.       struct sockaddr_in adresse;
  17.       int port = 1000; // Port de connexion
  18.       char buffer_ip[16]; // Buffer adresse ip
  19.      
  20.       int envoyer, recevoir;
  21.       char buffer_send[512]; // Buffer d'envoi
  22.       char buffer_recv[512]; // Buffer de reception
  23.      
  24.      
  25.       if((start_wsa = WSAStartup(MAKEWORD(2,0), &WSAData)) != 0) {  // Initialisation de la dll Winsock
  26.               printf("Erreur : Initialisation de winsock impossible \n" );
  27.               return 0; // Si erreur fin d'éxécution du programme
  28.               }
  29.              
  30.      if((socket_c = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){ // Création de la socket
  31.               printf("Erreur : Création de la  socket impossible \n" );
  32.               return 0; // Si erreur fin d'éxécution du programme
  33.               }
  34.              
  35.      
  36.       printf("Entrez l'adresse du serveur, exemple : XXX.XXX.XXX.XXX\n\n" ); // Entrez l'adresse du serveur
  37.       scanf("%s", buffer_ip);
  38.       printf("Connexion ...\n\n" );
  39.          
  40.       adresse.sin_addr.s_addr = inet_addr(buffer_ip);
  41.       adresse.sin_family    = AF_INET;
  42.       adresse.sin_port    = htons(port);
  43.        
  44.       if((socket_c = connect(socket_c,(struct sockaddr *)&adresse, sizeof(adresse))) == -1) { // Connexion avec le serveur
  45.                printf("Erreur : Connexion avec le serveur impossible\n" );
  46.                return 0;
  47.                }
  48.            
  49.       printf("Connecte au serveur\n" );
  50.       printf("En attente d'un message\n\n" );
  51.      
  52.       int c;
  53.       while ((c = getchar()) != '\n' && c != EOF); /* purge du tampon */             
  54.        
  55.       while(socket_c != INVALID_SOCKET)
  56.       {
  57.      
  58.              
  59.       if((recevoir =  recv(socket_c, buffer_recv,512,0)) != SOCKET_ERROR) // Reception des données
  60.            {
  61.                   printf("%s\n", buffer_recv);
  62.            }
  63.          
  64.       fgets(buffer_send, sizeof(buffer_send), stdin);
  65.      
  66.       if ((envoyer = send(socket_c, buffer_send, strlen(buffer_send), 0)) != strlen(buffer_send)) // Envoyer les données
  67.          {
  68.          printf("Erreur : Envois des donnees impossible\n" );
  69.          return 0;
  70.          }
  71.        
  72.       }
  73.      
  74.       shutdown(socket_c, 2);
  75.       close(socket_c, 2);
  76.       WSACleanup();
  77.       return 0;
  78.      
  79.    
  80.        }


 
Je lance donc le serveur, puis le client, je tape l'adresse locale ... et là "erreur envois des données impossible et fin d'éxécution du programme cote client !
J'ai retourné la chose dans presque tout les sens mais je n'y arrive pas !
 
Si un programmeur chevronné passe par là ça serait sympa de me sortir de la galère  :D  
 
merci
@++


Message édité par thechief le 03-05-2006 à 21:42:34
Reply

Marsh Posté le 03-05-2006 à 21:42:08   

Reply

Marsh Posté le 04-05-2006 à 16:47:40    

Salut,
la doc du "send" dit:
"Return Values
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets. Otherwise, a value of SOCKET_ERROR is returned,
"
-> verifie si le code retour vaut SOCKET_ERROR au lieu de faire ton test sur la longueur.
Et la si il y a effectivement une erreur, tu peux en avoir le descriptif avec la fonction WSAGetLastError

Reply

Marsh Posté le 06-05-2006 à 23:18:02    

Je suis sur maintenant que cela provient du client,
J'ai fait le test du serveur avec netcat, ce dernier communique avec le serveur sans problème ...
Effectivement il faudrait que je regarde le code d'erreur retourné, mais est-ce que ça ne peut pas provenir d'autre chose ? Une variable mal renseignée ?
 
merci

Reply

Marsh Posté le 07-05-2006 à 11:03:56    

Quand je vois ca:

Code :
  1. if ((envoyer = send(socket_c, buffer_send, strlen(buffer_send), 0)) != strlen(buffer_send))
  2. // Envoyer les données
  3. {
  4.           printf("Erreur : Envois des donnees impossible\n" );
  5.          return 0;
  6. }


et que tu me dis que le message d'erreur est "Erreur : Envois des donnees impossible" y a pas 36 facons de regler le probleme: savoir quel est le code retour de "send".


Message édité par breizhbugs le 07-05-2006 à 11:04:43
Reply

Marsh Posté le 07-05-2006 à 11:10:53    

+1


---------------
Töp of the plöp
Reply

Sujets relatifs:

Leave a Replay

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