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

  FORUM HardWare.fr
  Programmation
  C

  [C]Problème de socket.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C]Problème de socket.

n°1417761
Yoshitu
Posté le 01-08-2006 à 22:18:10  profilanswer
 

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
 
+

mood
Publicité
Posté le 01-08-2006 à 22:18:10  profilanswer
 

n°1417813
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-08-2006 à 23:59:28  profilanswer
 

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/
n°1417819
Yoshitu
Posté le 02-08-2006 à 00:16:44  profilanswer
 

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

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

  [C]Problème de socket.

 

Sujets relatifs
Problème avec TinyMCEproblème de boucle
Probleme avec bouton et image de fondprobléme d'images
Problème MVC <-> HibernateProbleme de Memoire
Probleme pour me connecter a mysql sur reseauProblème de timestamp et mktime
[EJB3][Easybeans] Problème déploiement Statefulbeanprobleme avec mes balises php [ réglé ]
Plus de sujets relatifs à : [C]Problème de socket.


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