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 :

socket non bloquant


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Par défaut socket non bloquant
    Tout est dans le titre, j'arrive pas a faire de mon socket, un socket non bloquant, voici le code de la fonction pour recevoir le message du serveur.
    La variable readfds etant de type fd_set
    La variable socket est de type SOCKET est bien initialisé car j'arrive a recevoir des messages quand j'en envoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Server::recevoir_message()
    {
    	message = new char[1024];
    	int result = 0;
    	FD_ZERO(&readfds);
    	FD_SET(socket,&readfds);
    	select(0,&readfds,0,0,NULL);
    	if(FD_ISSET(socket, &readfds))
    	{
    		result = recv ( socket, message , 1024 , 0 ) ;
    	}
    	return result;
    }
    Lorsque je lance cette fonction dans une boucle, la boucle se bloque si le serveur aucun message n'est reçu.
    Apparemment le bloquage se fait au niveau du select d'apres mes tests.
    Si vous pouvez eclairer ma lanterne ca serait sympa ! Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut
    La socket doit être mis non bloquante après sa déclaration, voici la fonction classique pour le faire qui est utilisé dans beaucoup de tuto et qui a le mérite d'être cross-platform.
    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
     
    /*----------------------------------------------------------------------
     Portable function to set a socket into nonblocking mode.
     Calling this on a socket causes all future read() and write() calls on
     that socket to do only as much as they can immediately, and return 
     without waiting.
     If no data can be read or written, they return -1 and set errno
     to EAGAIN (or EWOULDBLOCK).
     Thanks to Bjorn Reese for this code.
    ----------------------------------------------------------------------*/
    int setNonblocking(int fd)
    {
        int flags;
     
        /* If they have O_NONBLOCK, use the Posix way to do it */
    #if defined(O_NONBLOCK)
        /* Fixme: O_NONBLOCK is defined but broken on SunOS 4.1.x and AIX 3.2.5. */
        if (-1 == (flags = fcntl(fd, F_GETFL, 0)))
            flags = 0;
        return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    #else
        /* Otherwise, use the old way of doing it */
        flags = 1;
        return ioctl(fd, FIOBIO, &flags);
    #endif
    }

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Normal, la fonction select bloque jusqu'à ce qu'il y ait des données à lire.

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par défaut
    Oops j'avais même pas lu jusqu'au bout, si tu ne veux pas que select bloc plus d'un certain temps, pour continuer à executer une routine par exemple dans un programme non threadé, tu peux spécifier un timeout à la fonction select.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Par défaut
    Vous auriez un exemple plus au moins complet avec declaration de socket, mise en non bloquant et un timeout pour le select parce que j'ai du mal à visualiser la.

    En tout cas merci pour l'aide jusque là.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Lis ton manuel unix, ça t'expliquera comment select fonctionne.

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

Discussions similaires

  1. Socket non bloquant
    Par Shredder dans le forum Web & réseau
    Réponses: 1
    Dernier message: 29/10/2007, 11h44
  2. [timer & thread] timeout & socket non bloquant
    Par untipy dans le forum Réseau
    Réponses: 33
    Dernier message: 22/08/2007, 08h37
  3. [Réseau] socket non bloquant
    Par beLz dans le forum Réseau
    Réponses: 2
    Dernier message: 28/07/2007, 15h20
  4. Réponses: 3
    Dernier message: 20/10/2006, 19h50
  5. socket non bloquante
    Par jeje99 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/02/2006, 08h52

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