Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2939 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] une messagerie instantanée simple

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] une messagerie instantanée simple

n°1359044
thechief
Posté le 03-05-2006 à 21:42:08  profilanswer
 

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
mood
Publicité
Posté le 03-05-2006 à 21:42:08  profilanswer
 

n°1359806
breizhbugs
Posté le 04-05-2006 à 16:47:40  profilanswer
 

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

n°1361057
thechief
Posté le 06-05-2006 à 23:18:02  profilanswer
 

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

n°1361158
breizhbugs
Posté le 07-05-2006 à 11:03:56  profilanswer
 

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
n°1361162
_darkalt3_
Proctopathe
Posté le 07-05-2006 à 11:10:53  profilanswer
 

+1


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] une messagerie instantanée simple

 

Sujets relatifs
Création d'un simple menu graphique.Aide : Quel est plus simple langague de programmation .
demande petites explication simple : if+ ===BDD simple (tableau 10 colonnes) > comment m'y prendre ?
Question simple de mise en page (newb)script simple mais je ne suis qu'un débutant :D
simple boucleSoucis avec un tableau simple
[HELP] PHP et Bouton flash simple, mais je ne sais pas comment[RESOLU] question tres simple sur nombre de caracteres a l'ecriture
Plus de sujets relatifs à : [C] une messagerie instantanée simple


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR