[C] problème prog réseau

problème prog réseau [C] - C - Programmation

Marsh Posté le 16-04-2005 à 19:08:11    

C'est un problème bête mais je suis en train de faire un petit prog réseau et j'obtiens cette erreur:
 


Service 20000 demande a debian
Type d adresse 2 ; descripteur de socket 3
Reponse : message recu$ûÿ¿1 Mon J


 
Pourquoi ne reçois-je pas simplement "message reçu" ?
 

Code :
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <stdlib.h>
  7. #define BUFSIZE 200
  8. #define NORMAL 0
  9. int main(int argc, char ** argv)
  10. {
  11. int s;
  12. int len;
  13. struct sockaddr_in sa;
  14. struct hostent * hp;
  15. struct servent * sp;
  16. char * myname;
  17. char buf[BUFSIZE];
  18. char *host;
  19. myname=argv[0];
  20. if(argc!=2){
  21.  fprintf(stderr,"Usage : %s serveur\n",myname);
  22.  exit(EXIT_FAILURE);
  23. }
  24. host=argv[1];
  25. if((hp = gethostbyname(host))==NULL){
  26.  fprintf(stderr,"%s : %s serveur inconnu\n",myname,host);
  27.  exit(EXIT_FAILURE);
  28. }
  29. bcopy((char*)hp->h_addr,(char*)&sa.sin_addr,hp->h_length);
  30. sa.sin_family = hp->h_addrtype;
  31. sa.sin_port=20000;
  32. if((s=socket(hp->h_addrtype,SOCK_STREAM,0))<0){
  33.  perror("socket" );
  34.  exit(EXIT_FAILURE);
  35. }
  36. fprintf(stdout,"Service %d demande a %s\n",sa.sin_port,host);
  37. fprintf(stdout,"Type d adresse %d ; descripteur de socket %d \n",sa.sin_family,s);
  38. if(connect(s,(struct sockaddr*)&sa,sizeof(sa))<0){
  39.  perror("connect" );
  40.  exit(EXIT_FAILURE);
  41. }
  42. recv(s,buf,BUFSIZE,NORMAL);
  43. fprintf(stdout,"Reponse : %s\n",buf);
  44. close(s);
  45. exit(EXIT_SUCCESS);
  46. }


 
 

Code :
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <netdb.h>
  6. #include <stdlib.h>
  7. #define BUFSIZE 200
  8. #define NORMAL 0
  9. #define BACKLOG 1
  10. #define MAXHOSTNAME 32
  11. #define MAXREQ 5
  12. void sendmess(int sock);
  13. int main(int argc, char ** argv)
  14. {
  15. int s,t;
  16. int i, count_req;
  17. struct sockaddr_in sa;
  18. struct sockaddr_in isa;
  19. struct hostent *hp;
  20. struct hostent *sp;
  21. char localhost[MAXHOSTNAME+1];
  22. sa.sin_port=20000;
  23. gethostname(localhost,MAXHOSTNAME);
  24. hp=gethostbyname(localhost);
  25. bcopy(hp->h_addr,(char*)&sa.sin_addr,hp->h_length);
  26. sa.sin_family=hp->h_addrtype;
  27. if((s = socket(hp->h_addrtype,SOCK_STREAM,0))<0){
  28.  perror("Serveur : probleme creation socket\n" );
  29.  exit(EXIT_FAILURE);
  30. }
  31. if(bind(s,(struct sockaddr *)&sa,sizeof(sa))<0){
  32.  fprintf(stderr,"Serveur : probleme creation lien\n" );
  33.  exit(EXIT_FAILURE);
  34. }
  35. listen(s,BACKLOG);
  36. fprintf(stdout,"Service %d sur %s en attente\n", sa.sin_port,localhost);
  37. fprintf(stdout,"type d adresse : %d\n",sa.sin_family);
  38. for(count_req = 0; count_req <= MAXREQ; count_req++){
  39.  t=accept(s,(struct sockaddr *)&isa,&i);
  40.  fprintf(stdout,"Requete %d\n",count_req);
  41.  sendmess(t);
  42.  close(t);
  43. }
  44. close(s);
  45. fprintf(stdout,"in du service pour %s\n", localhost);
  46. return(EXIT_SUCCESS);
  47. }
  48. void sendmess(int sock)
  49. {
  50. char * buf = "message recu";
  51. send(sock,buf,strlen(buf),NORMAL);
  52. }

Reply

Marsh Posté le 16-04-2005 à 19:08:11   

Reply

Marsh Posté le 16-04-2005 à 19:12:18    

Y'a peut-etre pas de \0 dans ton buffer


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 16-04-2005 à 19:26:59    

Arf, j'ai toujours eu du mal avec les char...
 
Merci ;)

Reply

Marsh Posté le 16-04-2005 à 19:28:59    

strlen ne compte pas le '\0' final donc faut faire strlen(buf) + 1.

Reply

Marsh Posté le 16-04-2005 à 19:30:15    

et initialiser le contenu du buffer à 0. (memcpy ou bzero)


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 16-04-2005 à 19:35:49    

boulax a écrit :

et initialiser le contenu du buffer à 0. (memcpy ou bzero)


ni l'un ni l'autre
 
par contre memset
 
ou tout simplement = ""

Reply

Marsh Posté le 16-04-2005 à 19:38:00    

Taz a écrit :

ni l'un ni l'autre
 
par contre memset
 
ou tout simplement = ""


 
memset voila. spa bien bzero ?


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

Marsh Posté le 16-04-2005 à 19:38:45    

nan, spa standard et complètement obsolète.

Reply

Marsh Posté le 16-04-2005 à 20:06:50    

bzero n'est qu'une macro utilisant memset en général ;)

Reply

Marsh Posté le 16-04-2005 à 20:09:29    

memset est de plus bas niveau ?

Reply

Marsh Posté le 16-04-2005 à 20:09:29   

Reply

Marsh Posté le 16-04-2005 à 20:13:01    

boulax a écrit :

et initialiser le contenu du buffer à 0. (memcpy ou bzero)


 
ou calloc :o

Reply

Sujets relatifs:

Leave a Replay

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