programmation socket. fonction accept() retourne 0

programmation socket. fonction accept() retourne 0 - C++ - Programmation

Marsh Posté le 11-04-2006 à 01:51:44    

Je suis en train de programmer une bibliothéque de communication reseau et cela fait plus d'une semaine que j'essaie de voir d'ou viens le probléme, mais je n'arrive pas!!! je me tourne alors vers vous en esperant que vous ayez deja rencontré ce probléme ou que vous etes bien doués en programmation socket.
 
Mon Probléme:
 
dans une communication en TCP entre deux ordinateurs l'un envoie un connect() qui se passe trés bien mais le probléme c'est que l'autre ordinateur à l'autre bout quand il accept la connexion avec la fonction accept() il me retourne 0 alors qu'il est censé renvoyé une socket pour communiquer avec l'autre ordi.
 
Man 2 socket: "       L'appel système accept extrait la première connexion de la
       file  des  connexions en attente, crée une nouvelle socket
       avec essentiellement les  mêmes  propriétés  que  sock  et
       alloue  un  nouveau  descripteur  de  fichier  pour  cette
       socket."
 
Voila Mon probléme en gros accept() renvoie 0 alors qu il ne doit pas  :(  Si quelqun a la reponse il sera mon sauveur...
 
PS: pour ne pas encombrer mon message je n'ai pas ajouter le code, s'il ya besoin je suis pret a le faire.

Reply

Marsh Posté le 11-04-2006 à 01:51:44   

Reply

Marsh Posté le 11-04-2006 à 09:06:58    

normalement, si accept() te renvoie 0, c'est que la socket a été ouverte sur le file descriptor 0. C'est pas une erreur (c'est juste surprenant étant donné que le fd 0 correspond normalement à l'entrée standard). Je suppose que tu as fermé stdin avant ?


---------------
TriScale innov
Reply

Marsh Posté le 11-04-2006 à 10:58:23    

franceso a écrit :

normalement, si accept() te renvoie 0, c'est que la socket a été ouverte sur le file descriptor 0. C'est pas une erreur (c'est juste surprenant étant donné que le fd 0 correspond normalement à l'entrée standard)


 
Merci pour ta réponse,
Ca me semble bizarre aussi que accept() retourne 0 qui lui correspond a STDIN.
 

franceso a écrit :

Je suppose que tu as fermé stdin avant ?


 
Pourquoi dois-je fermer stdin?logiquement on est pas censé s'en occuper!!
En plus les socket que je gére sont dans le domaine AF_INET.

Reply

Marsh Posté le 11-04-2006 à 11:11:50    

Citation :

Pourquoi dois-je fermer stdin?logiquement on est pas censé s'en occuper!!
En plus les socket que je gére sont dans le domaine AF_INET.

Effectivement, tu n'as normalement pas à t'occuper de stdin. Mais je ne comprends pas comment accept peut te renvoyer un 0 si le fd 0 est encore ouvert.  


---------------
TriScale innov
Reply

Marsh Posté le 11-04-2006 à 11:24:31    

franceso a écrit :

Citation :

Pourquoi dois-je fermer stdin?logiquement on est pas censé s'en occuper!!
En plus les socket que je gére sont dans le domaine AF_INET.

Effectivement, tu n'as normalement pas à t'occuper de stdin. Mais je ne comprends pas comment accept peut te renvoyer un 0 si le fd 0 est encore ouvert.


 
C'est ce qui me prend vraiment la tete depuis quelques jours c'est que le resultat obtenu par accept() n'est pas du tout logique, surtout qu'au cours de mes tests j'ai remarqué que la fonction accept() n'est lancé qu'aprés la demande connect() de l'autre PC ce qui est tout a fait correct, donc je vois vraiment pas ce que viens STDIN se méler dans tout ca  :pt1cable:

Reply

Marsh Posté le 11-04-2006 à 12:13:12    

tu peux envoyer ton code ? il y a peut-être une erreur quelque part avant...


---------------
TriScale innov
Reply

Marsh Posté le 11-04-2006 à 18:43:31    

Je vais essayer d'indenter et de commenter mon code pour qu'il soit plus lisible.Je le post dés que possible

Reply

Marsh Posté le 12-04-2006 à 00:05:00    

Il est difficile de montrer tous le code car il y a plusieurs class c assez long mais voila les parties qui posent probleme.
 
1ere partie:
 

Code :
  1. //création de la socket
  2.         Socket=socket(AF_INET,SOCK_STREAM,0);
  3.         if (Socket==-1)
  4. {
  5.  perror("impossible de creer la socket" );
  6.  exit(1);
  7. }
  8.      //récuperation de l'adresse de la socket de l'hote a qui on veut se connecter
  9. struct sockaddr_in *A=Hote->getAdresse();
  10.     //connect à l'hote     
  11. if(connect(Socket,(struct sockaddr*)A, sizeof(struct sockaddr))==-1)
  12. {
  13.  perror("connect" );
  14.  exit(1);
  15. }
  16. etat=Connecte;


 
2éme partie et c'est la que ca coince:
 

Code :
  1. int new_fd;
  2. struct sockaddr_in their_addr;
  3. socklen_t sin_size = sizeof(struct sockaddr_in);
  4. fd_set rfds;
  5. struct timeval tv;
  6.         int retval;
  7. tv.tv_sec = 2;
  8. tv.tv_usec = 0;
  9. //L'ajout de la socket sock_conn dans le SET du select
  10. FD_ZERO(&rfds);
  11. FD_SET(socket_conn, &rfds);
  12. //select attend 2 seconde si 1 truc se passe en lecture sur la socket sock_conn
  13. retval = select(socket_conn+1, &rfds, NULL, NULL, &tv);
  14. //Acceptation des demandes de connection en TCP qui ne marche pas  :fou: !!
  15. if (retval==1)
  16. {
  17. if(new_fd = accept(socket_conn,(struct sockaddr*) &their_addr,&sin_size)<0)
  18. {
  19.  //Pour voir si l accept passe et que l'erreur c qu'il est non-bloquant
  20.                 if(errno!=EWOULDBLOCK)
  21.  {
  22.  perror("accept" );
  23.  std::exit(1);
  24.  }
  25. }
  26. else{
  27.  printf("accepte\n" );
  28.  printf("new fd : %d \n",new_fd); //Et c'est ici mon probléme ca m'affiche 0 c'est pas normal
  29. }
  30. }else printf("j'ai rien recu sur socket_conn  depuis 2 secondes \n" );


 
Je recapitule: la 1ere partie est censé envoyé une requete connect() à un hote.2éme partie censé accepter ce meme connect() et renvoyé un descripteur de fichier mais le malheur c'est que ca me renvoie 0 qui est STDIN.
 
Bon j'espere que ca vous dit quelque chose car la c'est pas evident j'avoue...


Message édité par imad_limoges le 12-04-2006 à 00:09:15
Reply

Marsh Posté le 19-07-2006 à 11:47:36    

Il manquerait pas tout simplement le listen(socket,nbSocketAEcouter) ?
 
Je sais ça date d'avril mais bon ...

Reply

Sujets relatifs:

Leave a Replay

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