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

  FORUM HardWare.fr
  Programmation
  C++

  programmation socket. fonction accept() retourne 0

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programmation socket. fonction accept() retourne 0

n°1343731
imad_limog​es
Posté le 11-04-2006 à 01:51:44  profilanswer
 

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.

mood
Publicité
Posté le 11-04-2006 à 01:51:44  profilanswer
 

n°1343767
franceso
Posté le 11-04-2006 à 09:06:58  profilanswer
 

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
n°1343882
imad_limog​es
Posté le 11-04-2006 à 10:58:23  profilanswer
 

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.

n°1343900
franceso
Posté le 11-04-2006 à 11:11:50  profilanswer
 

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
n°1343918
imad_limog​es
Posté le 11-04-2006 à 11:24:31  profilanswer
 

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:

n°1343982
franceso
Posté le 11-04-2006 à 12:13:12  profilanswer
 

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


---------------
TriScale innov
n°1344380
imad_limog​es
Posté le 11-04-2006 à 18:43:31  profilanswer
 

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

n°1344629
imad_limog​es
Posté le 12-04-2006 à 00:05:00  profilanswer
 

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
n°1409312
Ange44
Posté le 19-07-2006 à 11:47:36  profilanswer
 

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


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

  programmation socket. fonction accept() retourne 0

 

Sujets relatifs
Fonction HTML to BMP gratuite ? Convertir une page Web en image...Contenu d'une liste en fonction d'une autre le tout dynamiquement
programmation php[C/Socket]Programmer un proxy
fonction feof (), ecriture sur un fichier textecocher automatiquement 1 checkbox en fonction des données d'1 listbox
[résolu][C]Aide programmation somme de série numérique.QQ1 peut il m'aider à propos de socket non bloquant je n'y connais rie
Afficher dans une TextBox en fonction d'une ListBoxBatch Dos. Fonction pour récuperer le nom du fichier dans un path?
Plus de sujets relatifs à : programmation socket. fonction accept() retourne 0


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