Gérér les TIME OUT avec l'API Winsock

Signaler
Messages postés
4
Date d'inscription
dimanche 9 novembre 2003
Statut
Membre
Dernière intervention
10 novembre 2003
-
l_ankou
Messages postés
1
Date d'inscription
mercredi 9 novembre 2005
Statut
Membre
Dernière intervention
9 novembre 2005
-
bouyour,

je souhaiterai savoir comment utiliser un systeme de timing out afin de quitter les procédure bloquantes de winsock telles que recv() ou connect().

merci beaucoup

:-p foxdie

13 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
setsockopt(...) avec SO_SNDTIMEO et SO_RCVTIMEO.
Messages postés
4
Date d'inscription
dimanche 9 novembre 2003
Statut
Membre
Dernière intervention
10 novembre 2003

Malheureusement non, SO_RCVTIMEO ne peut etre utilisé qu'avec getsockopt() et non pas avec setsockopt().

Merci quand meme, si quelqu'un connait un moyen de fixer un time out pour la fonction recv(), merci pour son aide ;o)

:-p foxdie
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
MSDN et les livres sur la programation reseaux m'auraient ils menti ?
Refais des tests.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
J'ai fait des tests, tout va bien. On peut regler le les timeout d'un socket avec setsockopt(...).
Ouf, je suis rassuré.
Messages postés
4
Date d'inscription
dimanche 9 novembre 2003
Statut
Membre
Dernière intervention
10 novembre 2003

Je comprends pas....
J'ai écris ca dnas mon code :
int optval = 0x10; /* 16 millisecondes exprès pour qu'il est time out*/
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&optval, sizeof(optval));


et puis ca ne change rien du tout.
PAr ailleurs je vois sur msdn.com ceci :

 
BSD options not supported for setsockopt are shown in the following table.

Value Type Meaning 
SO_ACCEPTCONN BOOL Socket is listening. 
SO_RCVLOWAT int Receives low watermark. 
SO_RCVTIMEO int Receives time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2). 
SO_SNDLOWAT int Sends low watermark. 
SO_SNDTIMEO int Sends time-out in milliseconds (available in the Microsoft implementation of Windows Sockets 2). 
SO_TYPE int Type of the socket.


Tu vois bien que SO_RCVTIMEO est dans la liste, et donc pas supporté avec setsockopt.

Sur une page de man linux on voit aussi :

Les options suivantes sont traitees au niveau socket. Sauf indication contraire, elles peuvent toutes etre examinees avec getsockopt et positionnees avec setsockopt.
...
SO_SNDTIMEO 
lit la valeur de timeout en emission (seulement en lecture) 
SO_RCVTIMEO 
lit la valeur de timeout en reception (seulement en lecture) 
...


Alors, g pas révé! je ne comprends pas ce que tu as fait comme tests.....

à suivre

:-p foxdie
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
"(available in the Microsoft implementation of Windows Sockets 2).".
J'imagine que dans les versions anterieures a la version 2.2 ca ne fonctionnait effectivement pas!
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Je viens de retester, en effet on ne peut pas descendre en dessous de 500ms de Timet Out (enfin si, mais il n'est pas pris en compte). Par contre si tu met 1000, 10000, etc... la ca marche. Désolé pour ce manque de précision.
Je vois pas l'utilité d'un timeout de 16ms, autant utiliser les sockets non bloquants, non ?
Messages postés
4
Date d'inscription
dimanche 9 novembre 2003
Statut
Membre
Dernière intervention
10 novembre 2003

lol, effectivement ya aucun interet à mettre un time out de 16 ms, ct juste pour etre sur que j'aurai un time out et voir si ca marche.
Par contre j'avais aps testé avec une valeur plus grande.
Je vais tester avec 1000 ms, ce qui me satisfait amplement.

Merci pour ton aide, ct sympa!

:-p foxdie
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Moi j'ai un décalage de 500ms dans mes mesures, donc pour obtenir un bloquage "reel" du socket de 1 seconde, il faut passer 500ms a setsockopt(...).
Messages postés
6
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
1 août 2005

Salut,

la discussion est un peu vieille (novembre 2003) mais elle m'intéresse car j'ai les mêmes besoins et que en suivant les explications que vous avez données le timeout ne marche pas avec moi. Sans doute qu'il y a quelque chose que je fais mal. Voici mon code

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
...
char message[BUFFER_LENGTH];
SOCKET skt_client;
SOCKADDR_IN sin_client;
int optval = 5000; // Timeout 5 sec
...
// Socket creation
sin_client.sin_addr.s_addr = inet_addr(..);sin_client.sin_family AF_INET; sin_client.sin_port htons(..);
skt_client = socket(AF_INET, SOCK_STREAM, 0);
if(skt_client == INVALID_SOCKET)
     throw string("ERROR");
setsockopt(skt_client, SOL_SOCKET, SO_RCVTIMEO, (char*)&optval, sizeof(optval)); 
setsockopt(skt_client, SOL_SOCKET, SO_SNDTIMEO, (char*)&optval, sizeof(optval));

// Socket connection
if(connect(skt_client, (SOCKADDR *)&sin_client, sizeof(sin_client)) != SOCKET_ERROR)
{
     message[0] = 0x15;
     message[1] = 0x66;
     message[2] = 0x00;
     message[3] = 0x78;
     message[4] = 0x50;
     if(send(skt_client, message, 5, 0) == SOCKET_ERROR)    throw string("ERROR");

     if(recv(skt_client, message, BUFFER_LENGTH, 0) != SOCKET_ERROR)
     ...
}
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,
Au lieu d'afficher des "throw string("ERROR");" qui ne t'avancent pas beaucoup, affiche plutot le numero de l'erreur que retourne WSAGetLastError() et regarde a quelle erreur cela correspond sur MSDN.
Messages postés
6
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
1 août 2005

Salut,

merci pour tes infos. J'ai finalement réussi en utilisant ta méthode de setsockopt. C'est génial, mon boss est content... Merci beaucoup. :big)
Messages postés
1
Date d'inscription
mercredi 9 novembre 2005
Statut
Membre
Dernière intervention
9 novembre 2005

"La règle de conception est celle qui signifie que le délai de propagation de retour (round-trip propagation delay) dans un domaine de collision ne peut pas excéder 512 bit times, ce qui est absolument nécessaire pour que la détection de collision puisse fonctionner correctement [..]"

Voir doc sur Ethernet ...

(__) / \ (°>
oo / ( .8086 ) //\
|_/ \ / \_/_