Timeout pour Socket

Signaler
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009
-
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Bonjour les programmeurs,



Je suis en train de créer une DLL pour rechercher des email sur
un serveur POP3. Pour l'instant ma DLL ne fait que loguer l'utilisateur
sur le serveur.

Mais le problème est que si le programme appelant la DLL utilise une
adresse IP inconnue, la DLL essaie de se connecter à l'IP sur le port
110 (port du protocole POP3) pendant 20 secondes, ce qui fait perdre un
peu de temps au programme.

J'ai donc cherché la résponse sur les forums et sur MSDN, mais je n'ai pas trouvé comment baisser cette maudite valeur .

J'ai essayé avec les sockets asynchrones et aussi avec SetSockOpt de
l'API Winsock, mais je ne trouve pas la valeur a modifier pour faire
baisser cette attente. La seule chose que j'ai trouvé c'est le moyen de
faire baisser l'attente de la fonction Send et de la fonction Receive
(et encore le résultat ne marche pas bien, même pas du tout).



Quelqu'un aurait-il une solution?



La taupe voit toujours tout (sauf les bugs)

1 réponse

Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Un p'tit bout de code vite fait.
J'suis pas certain que ca va résoudre
ton problème mais ca vaut l'coup d'essayer!

>> select() <<

int socket_connect( SOCKET fd, const struct sockaddr_in * inaddr )
{

struct fd_set write;
struct timeval tv;
int ret;
unsigned long yes = 1;

/* non-bloquant => yes */
ioctlsocket( fd, FIONBIO, &yes );

if ( -1 == connect( fd, inaddr, sizeof(struct sockaddr_in) ) )
{

/* le fait qu'un socket soit en mode bloquant n'indique nullement une erreur => opération en progrès */
if ( WSAEWOULDBLOCK != WSAGetLastError() )
return -1;

}

FD_ZERO( &write );
FD_SET( fd, &write );

/* timeout de 2.5 sec */
tv.tv_sec = 2; /* sec */
tv.tv_usec = 500000; /* microsec */

if ( (ret = select( 0, NULL, &write, NULL, &tv )) > 0 )
return 0; /* connecté ! */

if ( !ret )
WSASetLastError(WSAETIMEDOUT); /* timeout */
/* if ( ret -1 )> ERROR => WSAGetLastError() */

return -1;

}

~(.:: NitRic ::.)~