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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°740887
weed
Posté le 26-05-2004 à 23:59:32  profilanswer
 

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 ...

mood
Publicité
Posté le 26-05-2004 à 23:59:32  profilanswer
 

n°740944
Ernestor
modo-coco :o
Posté le 27-05-2004 à 01:46:00  profilanswer
 

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
n°740948
Mino
Posté le 27-05-2004 à 01:49:02  profilanswer
 

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

n°740955
weed
Posté le 27-05-2004 à 02:20:44  profilanswer
 

 
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

n°740961
matafan
Posté le 27-05-2004 à 04:32:57  profilanswer
 

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
n°741274
weed
Posté le 27-05-2004 à 11:35:55  profilanswer
 

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

n°741970
lkolrn
&lt;comment ça marche?&gt;
Posté le 27-05-2004 à 16:57:25  profilanswer
 

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

n°741992
lkolrn
&lt;comment ça marche?&gt;
Posté le 27-05-2004 à 17:06:12  profilanswer
 

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

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

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

 

Sujets relatifs
Bon site avec exemple animation de layer ?C# - Client Server TCP
[VB6] Créer une connexion multiclient/serveurComment trouver un serveur apache à l'université ?
[XML / C++] Création via ActiveX : Exemple ?Executez un script sur le serveur a partir d'une page Web
Connexion à une BD MS SQL Serveur[ASP 3.0] Upload des fichiers binaires sur le serveur
[ImageMagick] Plusieurs sessions sur le même serveur[langage C] Créer un logiciel client/serveur type ftp sous Linux
Plus de sujets relatifs à : [c] A quel moment le client se connecte au serveur ds mon exemple ?


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