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

foxdie_ck Messages postés 4 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 10 novembre 2003 - 9 nov. 2003 à 20:06
l_ankou Messages postés 1 Date d'inscription mercredi 9 novembre 2005 Statut Membre Dernière intervention 9 novembre 2005 - 9 nov. 2005 à 09:24
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

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 20:14
Salut,
setsockopt(...) avec SO_SNDTIMEO et SO_RCVTIMEO.
0
foxdie_ck Messages postés 4 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 10 novembre 2003
10 nov. 2003 à 00:07
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 nov. 2003 à 00:10
Salut,
MSDN et les livres sur la programation reseaux m'auraient ils menti ?
Refais des tests.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 nov. 2003 à 00:27
Salut,
J'ai fait des tests, tout va bien. On peut regler le les timeout d'un socket avec setsockopt(...).
Ouf, je suis rassuré.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
foxdie_ck Messages postés 4 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 10 novembre 2003
10 nov. 2003 à 11:43
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 nov. 2003 à 11:55
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!
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 nov. 2003 à 12:02
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 ?
0
foxdie_ck Messages postés 4 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 10 novembre 2003
10 nov. 2003 à 17:07
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 nov. 2003 à 17:19
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(...).
0
alexixlebaulois Messages postés 6 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 1 août 2005
23 juin 2004 à 11:49
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)
     ...
}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 juin 2004 à 13:57
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.
0
alexixlebaulois Messages postés 6 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 1 août 2005
23 juin 2004 à 16:19
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)
0
l_ankou Messages postés 1 Date d'inscription mercredi 9 novembre 2005 Statut Membre Dernière intervention 9 novembre 2005
9 nov. 2005 à 09:24
"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 ) //\
|_/ \ / \_/_
0
Rejoignez-nous