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
..., I think Slackware sounds better than 'Microsoft,'
-- Patrick Volkerding - founder and maintainer of Slackware