Timeout pour Socket

Oeil_de_taupe Messages postés 150 Date d'inscription samedi 31 janvier 2004 Statut Membre Dernière intervention 16 février 2009 - 12 févr. 2005 à 13:45
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 14 févr. 2005 à 02:13
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

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
14 févr. 2005 à 02:13
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 ::.)~
0
Rejoignez-nous