IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

select socket et time-out


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut select socket et time-out
    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;
    }
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

  2. #2
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Je vais m'auto-répondre car j'ai trouvé mon problème

    tv_sec : Sert à stocker le nombre de secondes à attendre.
    tv_usec : Sert à stocker un nombre de temps additionnel à tv_sec mais en micro-secondes et inférieur à 1 seconde.

    Le fait de mettre un nombre comme 500000000 dans tv_usec ne dépasera pas 1 seconde.

    Donc, pour mon code, ici ça aurait dû être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tv.tv_sec = iTimeOutSecondes;
    tv.tv_usec = iTimeOutSecondes % 1000L;
    Maintenant tout fonctionne bien
    Mieux vaut ne rien savoir que beaucoup savoir à moitié !
    Faite vous en pas avec la vie, personne en est sortie vivant !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Socket - Internet - Connection timed out: connect
    Par Ivelios dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 11/01/2010, 20h30
  2. [Web Service] socket timeout : read timed out
    Par AlexC3301 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 29/04/2009, 00h51
  3. Time out sur connexion à un Socket
    Par melleb dans le forum C#
    Réponses: 11
    Dernier message: 26/05/2008, 11h22
  4. Problème de time-out avec un socket client.
    Par Depteam1 dans le forum MFC
    Réponses: 3
    Dernier message: 17/10/2005, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo