Socket : fixer un timeout

Socket : fixer un timeout - C - Programmation

Marsh Posté le 18-01-2005 à 14:30:29    

Bonjour à tous,
 
voilà j'essaie de faire un programme très simple en C avec des sockets (sous linux). Le but est de se connecter à une machine sur un certain port, de balancer du texte, et de recup le résultat (comme du telnet ou du web).
 
Le problème que j'ai actuellement, c'est que si le serveur ne répond pas, mon programme part en sucette, alors que je voudrais moi afficher une erreur dans ce cas, bref gérer un timeout.  
D'après la doc, il semblerait que je doive utiliser setsockopt, mais je ne trouve aucun exemple de comment utiliser cette fonction. Alors si vous pouviez m'aider merci par avance.


Message édité par Ez4Me2KU le 18-01-2005 à 14:31:04
Reply

Marsh Posté le 18-01-2005 à 14:30:29   

Reply

Marsh Posté le 18-01-2005 à 14:38:00    

Avec le code c'est mieux :
 
J'utlise connect, read et write. Voilà ma connexion :
 

Code :
  1. if(connect( to_server_socket,
  2.                 (struct sockaddr *)&serverSockAddr,
  3.                 sizeof(serverSockAddr)) < 0 ) {
  4.                 printf("Erreur: connect impossible\n" );
  5.                 exit(0);
  6.         }

Reply

Marsh Posté le 18-01-2005 à 16:30:33    

bah tu peux faire un select() il me semble
http://www.labri.fr/Perso/~billaud [...] eau-9.html


Message édité par !cricri le 18-01-2005 à 16:33:09
Reply

Marsh Posté le 19-01-2005 à 06:37:15    

s'il veut gérer le timeout sur la connection, c'est un poil plus compliqué. En pseudo-code, voilà ce qu'il faut faire:
 

Code :
  1. statut=ERREUR;
  2. s=socket();
  3. /* on passe en mode non-bloquant */
  4. old_flags=fcntl(s);
  5. if ( !(old_flags & O_NONBLOCK) )
  6.   fcntl(s, old_flags|O_NONBLOCK);
  7. /* on lance la connection */
  8. ret=connect(s);
  9. /* mince alors... */
  10. if ( ret < 0 )
  11. {
  12.   /* la connection est en cours */
  13.   if ( errno == EINPROGRESS )
  14.   {
  15.      /* gestion du timeout et de la gueule de la socket en sortie */
  16.      if ( select(s+1, timeout) > 0 )
  17.      {
  18.        getsockopt(s, SOL_SOCKET, SO_ERROR, &plouf);
  19.        if ( !plouf )
  20.          statut=CONNECTE;
  21.      }
  22.      else
  23.        statut=TIMEOUT;
  24.   }
  25. }
  26. else
  27.   statut=CONNECTE
  28. /* on repasse en mode bloquant */
  29. if ( !(old_flags & O_NONBLOCK) )
  30.   fcntl(s, old_flags);


 
Il reste juste à mettre les bons paramètres au bon endroit et à faire une gestion un peu plus fine des erreurs [:ddr555]


Message édité par docmaboul le 19-01-2005 à 06:40:15
Reply

Sujets relatifs:

Leave a Replay

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