serveur -> client pour envoyer ok, serveur -> client pas ok

serveur -> client pour envoyer ok, serveur -> client pas ok - C - Programmation

Marsh Posté le 29-05-2004 à 16:08:05    

voilou je j'arrive bien a me connecter a serveur.c et serveur.c me renvoie une response, mais lorsque je veux envoyer un message de client -> serveur, je pensais qu'il suffisait d'inversait les send et recv avec client. et serveur.c
 
j'ai retiré les retour pour que le code soit plus court pour vous montrer.
 
serveur.c
 

Code :
  1. int sockfd, new_fd, numbytes;  /* Ecouter sock_fd, nouvelle connection sur new_fd */
  2. struct sockaddr_in my_addr;    /* Adresse */
  3. struct sockaddr_in their_addr; /* Adresse du connecté  */
  4. int sin_size;
  5. char buf[MAXDATASIZE];
  6. sockfd = socket(AF_INET, SOCK_STREAM, 0))
  7. my_addr.sin_family = AF_INET;         /* host byte order */
  8. my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
  9. my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-remplissage avec mon IP */
  10. bzero(&(my_addr.sin_zero), 8);        /* zero pour le reste de struct */
  11. bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) ;
  12. listen(sockfd, BACKLOG);
  13. while(1)
  14. {   /* main accept() loop */
  15.  sin_size = sizeof(struct sockaddr_in);
  16.  new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
  17.  if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
  18.  {
  19.   perror("\nrecv_serveur\n" );
  20.   exit(1);
  21.  }
  22.  buf[numbytes] = '\0';
  23.  printf("\nReçu: %s",buf);
  24.  close(new_fd);
  25.  /*
  26.  printf("\nvoie du msg, je suis sur serveur\n" );
  27.  if (send(new_fd, "j envoie un message", 15, 0) == -1)
  28.  {
  29.   perror("send" );
  30.  }
  31.  close(new_fd);
  32.  exit(0);
  33.  close(new_fd);             
  34.  */ 
  35.  while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
  36. }
  37. }


 
 
 
client.c
(l'adresse est en donné en argument

Code :
  1. int main(int argc, char *argv[])
  2. {
  3. int sockfd, numbytes; 
  4. char buf[MAXDATASIZE];
  5. struct hostent *he;
  6. struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */
  7. if (argc != 2)
  8. {
  9.  fprintf(stderr,"usage: client hostname\n" );
  10.  exit(1);
  11. }
  12. printf("\n Etabilssement de la connexion sur le serveur %s",argv[1]);
  13. if ((he=gethostbyname(argv[1])) == NULL)
  14. {      /* Info de l'hôte */
  15.  herror("gethostbyname" );
  16.  exit(1);
  17. }
  18. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  19. their_addr.sin_family = AF_INET;      /* host byte order */
  20. their_addr.sin_port = htons(PORT);    /* short, network byte order */
  21. their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  22. bzero(&(their_addr.sin_zero), 8);     /* zero pour le reste de struct */
  23. connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)
  24. if (send(sockfd, "paquet", 6, 0) == -1)
  25. {
  26.  perror("send" );
  27. }
  28. /*  
  29. numbytes=recv(sockfd, buf, MAXDATASIZE, 0);  
  30. buf[numbytes] = '\0';
  31. printf("\nReçu: %s",buf);
  32. */
  33. close(sockfd);
  34. return 0;
  35. }


 
 
lorsque j'essaie d'envoyer client -> serveur, recv de serveur.c me renvoit  
"recv_serveur : Transport endpoint is not connected"
 
sur google, http://www.google.com/search?q=%22 [...] put=search
j'ai vu : smap: getpeername failed: Transport endpoint is not connected
 
j'ai donc essayé d'utilisé cette fonction avant le listen de serveur.c :

Code :
  1. if( getpeername (sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) ) == -1)
  2. {
  3.  perror("\ngetpeername\n" );
  4.  exit(1);
  5. }


je ne sais pas si resoudrait mon probleme de "Transport endpoint is not connected"
 
de plus lorsque j'esssaie de compiler, j'ai un probleme avec l'argument 3 :

Citation :

serveur.c: In function `main':
serveur.c:195: warning: passing arg 3 of `getpeername' makes pointer from integer without a cast


Message édité par weed le 29-05-2004 à 16:09:22
Reply

Marsh Posté le 29-05-2004 à 16:08:05   

Reply

Marsh Posté le 30-05-2004 à 04:06:47    

" The server's original socket does not become part of the connection; instead, accept makes a new socket which participates in the connection. accept returns the descriptor for this socket. The server's original socket remains available for listening for further connection requests. "
 
 
 
 new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);  
       
    if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)  
    {  
      ...


Message édité par Deaddy le 30-05-2004 à 04:07:45
Reply

Marsh Posté le 31-05-2004 à 17:39:34    

un grand merci a toi,  Deaddy
 
ca marche  
 

Reply

Sujets relatifs:

Leave a Replay

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