no save
Assistance
Achat
News

Forum | programmation
[C] [Socket] Temps limite d'un connect()
crabs, le ven. 21 oct. 2005 à 08:38:53
Salut,
Tu peux passer par via la gestion signal alarm et l'utilisation de setjmp/longjmp
Si la résolution de ton timeout est la seconde regardes du coté de alarm,
si tu cherches la milliseconde, regarde du coté de setitimer.
Le problème de connect c'est qu'il est 'restartable' dans la reception des
signaux, donc il faut utiliser setjmp/longjump.
Je te files un code C qui permettait de faire ce genre de truc.

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>

jmp_buf timeout_jump ;
void timeout(int sig)
{
printf( "signal %d occurs\n", sig ) ;
longjmp( timeout_jump, 1 ) ;
}
/***
**** timeout serveur port timeout
**** Attention pas de verification de la ligne de commande
**** le process retourne :
**** - 0 : tout est ok
**** - 1 : erreur systeme
**** - 2 : timeout
***/
int main( int argc, char** argv )
{
int fd, ret ;
struct sockaddr_in sin ;
struct hostent* host ;
struct servent* sp ;

fd = socket( AF_INET, SOCK_STREAM, 0 ) ;
if ( fd == -1 ) { perror( "socket" ) ; return 1 ; }

host = gethostbyname( argv[1] ) ;
if ( !host ) { perror( "gethostbyname" ) ; return 1 ; }

sp = getservbyname( argv[2], "tcp" ) ;
if ( !sp ) { perror( "getservbyname" ) ; return 1 ; }

sin.sin_port = sp->s_port ;
memcpy( &(sin.sin_addr.s_addr), (char *)host->h_addr, host->h_length ) ;
sin.sin_family = AF_INET ;

// on arme le timeout
signal( SIGALRM, timeout ) ;
alarm( atoi(argv[3] ) ;
if ( setjmp( timeout_jump ) == 1 ) // c'est un timeout
{
printf( "C'est un timeout\n" ) ;
close(fd) ;
return 2 ;
}
else
{
ret = connect(fd,(struct sockaddr *)&sin,sizeof(struct sockaddr_in)) ;
if ( ret == -1 )
{
perror( "connect()" ) ;
alarm(0) ;
close(fd) ;
return 1 ;
}
}
alarm(0) ;
close( fd ) ;
return 0 ;
}


A+, bon courage, crabs

Précédentkilian
oct. 05
kilian
oct. 05
Suivant
REPONSES
crabs
oct. 05
kilian
oct. 05
kilian
oct. 05
crabs
oct. 05
kilian
oct. 05
Version Web
Réalisé par RedShift
no save