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

Réseau C Discussion :

programmation réseau - la fonction select()


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut programmation réseau - la fonction select()
    Bonjour à tous,

    J'ai un petit soucis. J'utilise la fonction select() pour surveiller un descripteur de socket. En fait dans les traitements des conditions FD_ISSET, en lecture je suis en attente d'un message, en écriture je veux pouvoir envoyer des messages toutes 10 secondes (c'est du ping) avec la même socket.
    Voila à quoi ressemble mon code :

    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
    42
    43
    44
    45
    46
    47
    48
     
     
    #include "UDPsocket.h"
    #include "NetworkBox.h"
     
    using namespace std;
     
    int main(int argc,char **argv)
    {
     
            UDPsocket server;
            UDPsocket client;
            int sdServ   = server.Open(12345);
            int sdClient = client.Connect("127.0.0.1",12345);
     
            NetworkBox from;
            string msg = "HELLO 23456";
     
            //initialization of file descriptor list
            fd_set fd_supervised;
            fd_set fd_ping;
     
            while(1)
            {
                    FD_ZERO(&fd_supervised);
                    FD_SET(sdServ,&fd_supervised);
     
                    FD_ZERO(&fd_ping);
                    FD_SET(sdClient,&fd_ping);
     
                    select(FD_SETSIZE, &fd_supervised, &fd_ping, NULL, NULL);
     
                    //retrieve the message from the server
                    if(FD_ISSET(sdServ, &fd_supervised))
                    {
                            server.RecvFrom(msg,from);
                            cout << "recu : " << msg << "\n\n" << endl;
                    }
     
                    //supervise sd writing
                    if(FD_ISSET(sdClient, &fd_supervised))
                    {
                            sleep(10);
                            client.SendTo(msg,"127.0.0.1",12345);
                    }
            }//while
     
    }//main()
    Je fais de la PO (C++). Les wrappers marchent bien, testé plusieurs fois.
    Je maitrise pas très bien les readfds et writefds et je ne trouve pas la solution, peut être faut-il une deuxième socket? Je pense qu'une seule devrait suffire, en plus ca m'arrangerait.

    Merci, a bientot.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(FD_ISSET(sdClient, &fd_supervised))
    Tu ne cherches pas sdClient dans le bon fd_set...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut petite erreur dans le code
    petite erreur dans la deuxiemme condition "if". Le fd_set de sdClient est fd_ping.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    //supervise sd writing
                    if(FD_ISSET(sdClient, &fd_ping))
                    {
                            sleep(10);
                            client.SendTo(msg,"127.0.0.1",12345);
                    }

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par u_brush_u
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using namespace std;
    Huh ! Le forum C++, c'est à coté...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    désole Emmanuel mais le réel problème porte sur l'utilisation de la fonction select() avec les readfds et writefds. Je cherche des initiés en programmation réseau qui pourraient me guider.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut je viens de tester les wrappers
    Pour faire preuve de ma bonne fois je viens de tester les wrappers qui marchent nickel.
    Voici les 2 programmes que j'ai lancé :

    Pour le serveur
    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
     
    int main(int argc,char **argv)
    {
            //initialization
            UDPsocket server;
            int sdServ   = server.Open(12345);
     
            NetworkBox from;
            string msg = "";
     
            while(1)
            {
                     server.RecvFrom(msg,from);
                     cout << "recu : " << msg << "\n\n" << endl;
            }//while
     
    }//main()
    Pour le client
    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
     
    int main(int argc,char **argv)
    {
            UDPsocket client;
            int sdClient = client.Connect("127.0.0.1",12345);
     
            NetworkBox from;
            string msg = "HELLO 23456";
     
            while(1)
            {
                    sleep(10);
                    client.SendTo(msg,"127.0.0.1",12345);
            }//while
     
    }//main()

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Exemple de FD_SET qui marche
    Voici un exemple de FD_SET que j'ai testé et qui marche.

    Code pour le serveur :
    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
     
    int main(int argc,char **argv)
    {
            //initialization
            UDPsocket server;
            int sdServ   = server.Open(12345);
     
            NetworkBox from;
            string msg = "HELLO 23456";
     
            //initialization of file descriptor list
            fd_set fd_supervised;
     
            while(1)
            {
                    FD_ZERO(&fd_supervised);
                    FD_SET(sdServ,&fd_supervised);
     
                    select(FD_SETSIZE, &fd_supervised, NULL, NULL, NULL);
     
                    //retrieve the message from the server
                    if(FD_ISSET(sdServ, &fd_supervised))
                    {
                            server.RecvFrom(msg,from);
                            cout << "recu : " << msg << "\n\n" << endl;
                    }
            }//while
     
    }//main()
    Code pour le client :
    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
     
    int main(int argc,char **argv)
    {
            //initialization
            UDPsocket client;
            int sdClient = client.Connect("127.0.0.1",12345);
     
            NetworkBox from;
            string msg = "HELLO 23456";
     
            //initialization of file descriptor list
            fd_set fd_ping;
     
            while(1)
            {
                    FD_ZERO(&fd_ping);
                    FD_SET(sdClient,&fd_ping);
     
                    select(FD_SETSIZE, NULL, &fd_ping, NULL, NULL);
     
                    //supervise sd writing
                    if(FD_ISSET(sdClient, &fd_ping))
                    {
                            sleep(3);
                            client.SendTo(msg,"127.0.0.1",12345);
                    }
            }//while
     
    }//main()
    Le problème c'est quand je joins les deux bouts de codes ca marche pas. Ca doit etre au niveau du select(). En fait je me prends la tête car je voudrais après utiliser qu'une seule socket et la surveiller en lecture/écriture.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par u_brush_u
    désole Emmanuel mais le réel problème porte sur l'utilisation de la fonction select() avec les readfds et writefds. Je cherche des initiés en programmation réseau qui pourraient me guider.
    Alors utilise les fonctions de POSIX.1, sinon, on y comprend rien. Et écrit en C si tu postes ici. On est pas censés connaitre le C++.

    Mais pour le programmation réseau, le bon forum est :

    http://www.developpez.net/forums/forumdisplay.php?f=63

    Peut être faudrait-il commencer par le commencement :

    http://www.developpez.net/forums/sho...55&postcount=2

    http://emmanuel-delahaye.developpez....aux.htm#select
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Merci Emmanuel pour ton lien, j'ai posté mon problème sur le bon forum.

Discussions similaires

  1. fonction select() pour gérer le temps pour un réseau
    Par albertopisto dans le forum Réseau
    Réponses: 6
    Dernier message: 25/07/2011, 18h27
  2. Ecoute réseau avec fonction select
    Par ptit fab dans le forum Réseau
    Réponses: 1
    Dernier message: 06/06/2008, 08h48
  3. programmation réseau - la fonction select()
    Par u_brush_u dans le forum Développement
    Réponses: 2
    Dernier message: 18/04/2007, 09h42
  4. Programmation d'une fonction dans Rn
    Par simone.51 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/11/2004, 11h30
  5. Pour débuter en programmation réseau
    Par durnambule dans le forum Développement
    Réponses: 3
    Dernier message: 20/06/2004, 22h21

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