[C - Newby] Communication par socket en UDP

Communication par socket en UDP [C - Newby] - C - Programmation

Marsh Posté le 19-10-2003 à 12:37:44    

Voilà, étant grand débutant je veux réaliser un client/serveur UDP. Le client envoie des chaînes de caractères que le serveur affiche sur son terminal de contrôle (les 2 programmes tournent sur la même machine). Voilà le code que j'ai tapé pour le client :
 

Code :
  1. main()
  2. {
  3.   int sock;
  4.   struct sockaddr_in emet,dest; 
  5.   char buf[]="bonjour";
  6.   char rep[1500];
  7.   sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  8.  
  9.   emet.sin_family=AF_INET;
  10.   emet.sin_port=htons(1500);
  11.   emet.sin_addr.s_addr=INADDR_ANY;
  12.   bind(sock,(struct sockaddr*)&emet,sizeof(emet));
  13.   sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&dest,sizeof(dest));
  14.   recvfrom(sock,(char*)rep,sizeof(rep),0,(struct sockaddr*)&dest,sizeof(dest));
  15.   for (int i=0;i<20;i++)
  16. printf("%x",rep[i]);
  17.   close(sock);
  18. }


 
et pour le serveur :

Code :
  1. main()
  2. {
  3.   int sock;
  4.   struct sockaddr_in emet,dest; 
  5.   char buf[]="bonjour";
  6.   char rep[1500];
  7.   sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  8.  
  9.   emet.sin_family=AF_INET;
  10.   emet.sin_port=htons(1500);
  11.   emet.sin_addr.s_addr=INADDR_ANY;
  12.   bind(sock,(struct sockaddr*)&emet,sizeof(emet));
  13.   recvfrom(sock,(char*)rep,sizeof(rep),0,(struct sockaddr*) &dest,sizeof(dest));
  14.   for (int i=0;i<20;i++)
  15. printf("%x",rep[i]);
  16.  
  17. sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&dest,sizeof(dest));
  18.   close(sock);
  19. }


 
Avec ce code, et en lançant le serveur puis le client, le client envoie son message mais le serveur ne reçoit rien et bloque sur recvform(...).
 
Quelqu'un pourrait m'aider svp?

Reply

Marsh Posté le 19-10-2003 à 12:37:44   

Reply

Marsh Posté le 19-10-2003 à 15:01:42    

Citation :

recvfrom(sock,(char*)rep,sizeof(rep),0,(struct sockaddr*) &dest,sizeof(dest) );


le parametre est par adresse: ssize_t recvfrom(int s, void *buf, size_t  len,  int  flags, struct sockaddr *from, int *fromlen);
donc:
len = sizeof(dest), et tu passes &len a l'appel.
A+,


Message édité par gilou le 19-10-2003 à 15:03:15

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-10-2003 à 19:28:48    

ça ne marche toujours pas

Reply

Marsh Posté le 19-10-2003 à 20:53:03    

testes les valeurs de retour des fonctions et trouve celle qui te renvoie une erreue

Reply

Marsh Posté le 21-10-2003 à 09:51:55    

C bon ça marche : le client ne fait qu'un sendto et le serveur qu'un recvfrom; dans le client il faut aussi construire l'adresse de destination.

Reply

Marsh Posté le 21-10-2003 à 09:54:35    

Et ton pb venait d'ou alors??
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-10-2003 à 22:07:17    

en fait il faut aussi construire l'adresse de destination dans le client. En plus j'ai utilisé la fonction gethostbyname avec une structure hostent pour récupérer l'adresse du destinataire.
 

Reply

Sujets relatifs:

Leave a Replay

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