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

Développement Discussion :

programmation réseau - la fonction select()


Sujet :

Développement

  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 c++ : 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_ping))
                    {
                            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
    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 avec mes wrappers.

    Code pour le serveur :
    Code c++ : 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 c++ : 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.

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    tu ne decris pas ton probleme clairement.
    de mémoire, il me semble qu'un socket est toujours pret en ecriture (IE: jamais bloquant) donc select te renvois toujours "pret" pour ce socket sur ce descripteur.

    et effectivement, une seule socket suffit.
    a ta place j'utiliserais le dernier champs de select (pour le timer de 10sec) et le readfds pour la reception:
    pseudo code vite fait:
    while(select(&readfds,NULL,NULL,timestrut_to_wait_10secs) != -1)
    {
    if(FD_ISSET...
    {
    recv(...
    }
    else
    {
    send(...
    }
    }
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

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 Réseau
    Réponses: 8
    Dernier message: 16/04/2007, 13h35
  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