[c] A quel moment le client se connecte au serveur ds mon exemple ?

A quel moment le client se connecte au serveur ds mon exemple ? [c] - C - Programmation

Marsh Posté le 26-05-2004 à 23:59:32    

bonjour,  
 
 
je comprends pas trop. Je pensais que le client envoyer les informations au serveur pour se connecter qu'a partir de la fonction connect () mais ca n'a pas l'air d'etre le cas ds mon exemple :
 
 
serveur.c :

Code :
  1. main()
  2. {
  3. int sockfd, new_fd;  /* Ecouter sock_fd, nouvelle connection sur new_fd */
  4. struct sockaddr_in my_addr;    /* Adresse */
  5. struct sockaddr_in their_addr; /* Adresse du connecté  */
  6. int sin_size;
  7. int bits=32;
  8. char    *entete = (char *) malloc ( bits * sizeof (int)+1);
  9. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  10.  {
  11.  perror("socket" );
  12.  exit(1);
  13. }
  14. my_addr.sin_family = AF_INET;         /* host byte order */
  15. my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
  16. my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-remplissage avec mon IP */
  17. bzero(&(my_addr.sin_zero), 8);        /* zero pour le reste de struct */
  18. if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  19.  {
  20.  perror("bind" );
  21.  exit(1);
  22. }
  23. if (listen(sockfd, BACKLOG) == -1)
  24.  {
  25.  perror("listen" );
  26.  exit(1);
  27. }
  28. while(1)
  29. {   /* main accept() loop */
  30.  sin_size = sizeof(struct sockaddr_in);
  31.  if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
  32.   {
  33.   perror("accept" );
  34.   continue;
  35.  }
  36.  printf("serveur: Connection recu de %s\n", inet_ntoa(their_addr.sin_addr));
  37.  tmenu_saisi (entete);
  38.  if (!fork())
  39.  { /* processus fils */
  40.   //printf("\npaquet envoyé : %s\n",entete,strlen(entete));
  41.   affichage(entete);
  42.   if (send(new_fd, entete, strlen(entete), 0) == -1)
  43.   {
  44.    perror("send" );
  45.   }
  46.   close(new_fd);
  47.   exit(0);
  48.  }
  49.  close(new_fd);  /* Le parent n'a pas besoin de cela */
  50. while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
  51. }
  52. }


 
 
et le client.c
 

Code :
  1. nt 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. int bits=32;
  8. char    *paquet = (char *) malloc ( bits * sizeof (int)+1);
  9. if (argc != 2)
  10. {
  11.  fprintf(stderr,"usage: client hostname\n" );
  12.  exit(1);
  13. }
  14. printf("\n Etabilssement de la connexion sur le serveur %s",argv[1]);
  15. saisi_port (paquet);
  16. if ((he=gethostbyname(argv[1])) == NULL)
  17. {      /* Info de l'hôte */
  18.  herror("gethostbyname" );
  19.  exit(1);
  20. }
  21. printf("ici" );
  22. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  23. {
  24.  perror("socket" );
  25.  exit(1);
  26. }
  27. their_addr.sin_family = AF_INET;      /* host byte order */
  28. their_addr.sin_port = htons(PORT);    /* short, network byte order */
  29. their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  30. bzero(&(their_addr.sin_zero), 8);     /* zero pour le reste de struct */
  31. if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
  32. {
  33.  perror("connect" );
  34.  exit(1);
  35. }
  36. if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
  37. {
  38.  perror("recv" );
  39.  exit(1);
  40. }
  41. buf[numbytes] = '\0';
  42. printf("Reçu: %s",buf);
  43. close(sockfd);
  44. return 0;
  45. }


 
 
je demare  
./serveur
puis ./client 127.0.0.1
la fenetre client me demande de taper mes numéro de port (fonction saisi_port) puis apres le client mouline et attends une reponse du serveur. Et c'est la que je comprends pas. Le printf("ici" ); juste avant la fonction socket de client.c
 
Donc le client mouline, je vais sur la fenetre serveur et je tape mon entete avec ma fonction :tmenu_saisi (entete); et l'entete est envoyé au client  
 
et ce qu'a partir de la que j'ai la main sur le client. Le client affiche "ici"(printf("ici" ). Pourquoi pas avant ?
 
 
Comment pourrais je envoyer un paquet au serveur dans un premier pour lui dire, je me connecte sur toi  
et apres le serveur reponds au client, ok tu peux te connecter ...

Reply

Marsh Posté le 26-05-2004 à 23:59:32   

Reply

Marsh Posté le 27-05-2004 à 01:46:00    

Essaie de vider le flux de sortie après ton printf avec un fflush machin que j'ai oublié comment ca marche depuis le temps que j'ai pas fait de C ...


---------------
Idéaliste pragmatique gauchiste cherche camarades pour fonder un parti
Reply

Marsh Posté le 27-05-2004 à 01:49:02    

Ton client est connecté au serveur dès lors que le serveur accepte la connexion avec la fonction "accept"

Reply

Marsh Posté le 27-05-2004 à 02:20:44    

 
Ernestor => ok j'essairais de faire ca, un flushall ou je ne sais quoi ou fflush(stdout)
 
Mino => je suis d'accord avec toi, mais c'est au niveau client que je me pose la question  
 
serveur    client  
  <-----------
 ------------>
<-----------
car j'aimerais faire que le client envoie en premier le paquet .
et si on mon raisonnement avec mon exemple il faudra que je fasse un send dans client.c au niveau de  
"printf("\n Etabilssement de la connexion sur le serveur %s",argv[1]); " pour envoyer un paquet au serveur.  Car sinon apres je perds la main.
Ca serait completement illogique de faire un send avant le connect dans client.c

Reply

Marsh Posté le 27-05-2004 à 04:32:57    

Comme l'as dit Ernestor, le client n'affiche pas « ici » plus tôt car la sortie est bufferisée... Bref il s'affiche longtemps après que le « printf » est effectivement été appelé. Ajoute un « \n » ou ajoute un fflush(stdout).
 
Edit : sinon je suis pas sûr d'avoir compris ce que tu veux, et je suis pas sûr que tu ai compris comment marche TCP. La connexion est faite par le « connect ». Quand tu sorts du connect, il y a déja eu 3 packets échangés : SYN vers le serveur, ACK vers le client, SYN/ACK vers le serveur. Et la connexion TCP est établie.


Message édité par matafan le 27-05-2004 à 04:36:36
Reply

Marsh Posté le 27-05-2004 à 11:35:55    

yep merci exact  
en mettant un simple \n cela marche
j'avais completement oublié qu'il etais conseille de le mettre en C unix alors qu'en C borland, je le mettais jamais

Reply

Marsh Posté le 27-05-2004 à 16:57:25    

C borland = C brânlant [:aras qui rit]

Reply

Marsh Posté le 27-05-2004 à 17:06:12    

weed a écrit sous l'influence certaine de substance naturelle illicite a écrit :

serveur    client  
  <-----------
 ------------>
<-----------
car j'aimerais faire que le client envoie en premier le paquet .


C se qui se passe en effet :D
 
Le serveur ne fait qu'attendre indéfiniment un signal d'entrée (le SYN dont parle matafan), c donc forcément du client qu'il émane dans ce cas là.. (l'inverse serait absurde ici)


Message édité par lkolrn le 27-05-2004 à 17:07:07
Reply

Sujets relatifs:

Leave a Replay

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