Bonjour à tous,
J'ai besion d'utiliser un socket non-bloquant. Car je ne veux pas qu'il bloque sur un recv et je désire pouvoir l'arrêter quand je veux.
Bref, j'ai lu sur la MSDN qu'il est possible de faire un select avec un time-out. Voici un peu plus bas le petit bout de code que j'ai pondu...
Le problème :
Le select de cette fonction me retourne 1, ce qui est parfait mais le ioctlsocket lui me retourne toujours 0.
Et j'ai remarqué que le temps que le select prend pour faire sa vérification n'est pas du tout celui spécifié par le TIMEVAL.
J'ai mis 10 secondes et ça bloque même pas une seule milliseconde
Merci d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 INT CXSocket::GetReadableByteCount(INT iTimeOutSecondes) { // Socket invalide ? if (m_Socket == INVALID_SOCKET) { return SOCKET_ERROR; } // Time-out struct TIMEVAL tv; TIMEVAL* tvPtr = NULL; if (iTimeOutSecondes != INFINITE) { tv.tv_sec = iTimeOutSecondes / 1000L; tv.tv_usec = iTimeOutSecondes % 1000L; tvPtr = &tv; } // Set de Descripteur fd_set readfds; FD_ZERO(&readfds); FD_SET(m_Socket, &readfds ); // Déterminé si le socket est lisible INT iRes = select(0, &readfds, NULL, NULL, tvPtr ); // Le socket est lisible if(iRes > 0) { // Déterminer la taille en bytes du contenu disponible pour lecture u_long lLen; iRes = ioctlsocket(m_Socket, FIONREAD, &lLen); if(iRes == 0) { // Retourner la taille return (int)lLen; } } return iRes; }
Partager