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

Langage C++ Discussion :

Descripteur de fichier incohérent !


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Descripteur de fichier incohérent !
    Bonjour !

    Voici une enigme :o

    Dans la boucle de mon programme, j'ai un select(), suivi de l'acceptation des clients, suivi de la boucle qui verifie si il y a quelque chose à lire sur les clients !
    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
        while(!shutdown)
        {
            cout << "boucle select"<<endl;
            if(!Master->Select(NULL))
            {
                continue;
            }
            if(FD_ISSET(Master->Socket(), &Master->GetSocketSet()))
            {
                TCPsocket is = Master->Accept();
                if(is != SOCKET_ERROR)
                {
                    string ip = Master->GetAcceptedIp();
     
                    cout << "Accepted connection from: " << ip << endl;
     
                    Master->AddClient(is, ip);
                }
            }
            for(auto itr = Master->Clients().begin(); itr != Master->Clients().end(); ++itr)
            {
    if(FD_ISSET(itr->second.GetSocket(), &Master->GetSocketSet()))
    {
                cout << "Boucle des clients"<<endl;
    }
            }
    }
    Voici la fonction Select:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            inline int Select(const long us) {
                if(us > 0)
                {
                    struct timeval tv;
                    tv.tv_sec = 0;
                    tv.tv_usec = us;
     
                    return select(_maxfd, &recvfs, NULL, NULL, &tv);
                }
                else
                {
                    return select(_maxfd, &recvfs, NULL, NULL, NULL);
                }
            }
    La fonction AddClient(), ajoute le socket au descripteur.

    Quand je demarre mon programme, j'ai:
    Boucle select
    Quand je connecte un client (des qu'il se connecte , il envoie un message)
    J'ai:
    Accepted [...]
    Problemes:
    • J'aimerais pouvoir faire en sorte que select() ne bloque pas la suite de la boucle, car je dois pouvoir lire les données tout le temps !
    • Quand un client se connecte, la connexion est bonne, mais je ne recois pas le message (en clair, FD_ISSET n'est pas true, alors qu'il devrait l'etre (puisque j'envoie un message tout de suite apres la connexion !))


    Quelqu'un a une idée? :o
    merci, nico.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    J'aimerais pouvoir faire en sorte que select() ne bloque pas la suite de la boucle, car je dois pouvoir lire les données tout le temps !
    Oui, mais s'il y a des données en lecture, le select() ne bloque pas. Précisément, il continue sa course, s'il y a une donnée à lire (que ce soit une nouvelle connexion ou juste des données entrantes).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Le truc, c'est que quand mon descripteur est vide, select retourne toujours < 0. Ca d'accord.
    Mais une fois que j'ajoute un client, j'aimerais que select() ne bloque pas l'integralité du programmedans le but de faire un ping sur tout les clients.
    Donc meme si mes clients n'evoient rien, il faut que je puisse avoir une boucle inifinie, et non une boucle bloquée par le select()

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Alors, dans ce cas là, il faut utiliser les threads, je pense.
    Sinon, vous pouvez utiliser le timeout de la fonction select. Qui arrêtera donc le select() au bout d'un certain temps.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. return d'un descripteur de fichier : FILE *
    Par awalter1 dans le forum C
    Réponses: 3
    Dernier message: 04/09/2008, 11h59
  2. Message "mauvais descripteur de fichier"
    Par robux dans le forum Ubuntu
    Réponses: 1
    Dernier message: 06/08/2008, 11h25
  3. Réponses: 5
    Dernier message: 07/03/2008, 16h20
  4. Probleme descripteur de fichier
    Par Blo0d4x3 dans le forum C
    Réponses: 12
    Dernier message: 17/05/2007, 02h10
  5. Descripteur de fichier
    Par Zazeglu dans le forum C
    Réponses: 22
    Dernier message: 15/09/2003, 19h45

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