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

Boost C++ Discussion :

Boost.asio pour écouter un port UDP


Sujet :

Boost C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut Boost.asio pour écouter un port UDP
    Salut, je viens de me mettre à boost et je veux réaliser une écoute sur un port UDP. J'ai déja un programme qui me permet de simuler des trames. J'ai fais un petit test pour essayer de les récupérer mais je n'y arrive pas.
    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
     
    int main()
    {
      try
      {
        boost::asio::io_service io_service;
        udp::endpoint endpoint    (boost::asio::ip::address::from_string("134.246.151.185"), 10001);
     
        udp::socket socket(io_service);
        socket.open(udp::v4());
        socket.connect(endpoint);
     
        boost::array<char, 128> recv_buf;
        size_t len = socket.receive(boost::asio::buffer(recv_buf));
     
        std::cout.write(recv_buf.data(), len);
     
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
     
      return 0;
     
    }
    Si quelqu'un pouvait m'aider ce serait sympa

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    As-tu jeté un coup d'oeil au tutoriel de Boost.Asio disponible sur le site ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Oui, j'ai même commencé par là.

    Mais je n'ai pas trouvé la réponse à ma question. Je veux juste écouter un port UDP sur lequel il y a des trames en continue tout le temps.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Il faut que tu "bind" ta socket et que tu utilises receive_from:
    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
    int main()
    {
      try
      {
        boost::asio::io_service io_service;
        udp::endpoint endpoint (boost::asio::ip::address::from_string("134.246.151.185"), 10001);
        udp::endpoint sender;
     
        udp::socket socket(io_service);
        socket.open(udp::v4());
        socket.bind(endpoint); // <------
     
        boost::array<char, 128> recv_buf;
        size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender);
     
        std::cout.write(recv_buf.data(), len);
     
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
     
      return 0;
     
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    J'ai essayé avec le bind, et lorsque je lançe l'application il y a l'erreur suivante :
    "une seule utilisation de chaque adresse de socket <protocole/adresse réseau/port> est habituellement autorisée."

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    L'adresse sur laquelle tu essaies de binder la socket est sans doute déjà utilisée.
    En tout cas le code de mon précédent message fonctionne chez moi.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Salut Montag,
    est ce que tu pourrais me montrer le code avec lequel tu simules stp. Je commence à croire que c'est le simulateur qui pose probleme (bien qu'il fonctionnait avec un programme similaire en java).
    Merci d'avance

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    En fait j'ai peut-être mal compris ce que tu souhaites faire.
    Le code que j'ai posté permet de créer un "serveur" en bindant une socket sur une adresse bien définie pour permettre à des clients d'y envoyer des données.
    Est-ce ce que tu veux faire ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Ah ok, je me suis peut être mal exprimé.
    Non en faites il existe déja un "serveur" qui envoi des données en continu sur un port UDP. Maintenant ce que je veux c'est faire une application permettant de récupérer ces données.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par grutt Voir le message
    J'ai essayé avec le bind, et lorsque je lançe l'application il y a l'erreur suivante :
    "une seule utilisation de chaque adresse de socket <protocole/adresse réseau/port> est habituellement autorisée."
    Comme dit par montag, ce genre d'erreur est typique lorsque tu essaies de lier (bind) 2 sockets UDP sur la même adresse (IP+port). Ca se produit : si ton client et ton serveur tourne sur la même machine ou si tu as 2 clients sur la même machine.
    Il faut utiliser l'option SO_REUSEADDR (cf doc boost)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Ok, merci beaucoup les gars
    J'arrive à récupérer les données

    Pour ceux que ça intéresse:
    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
    #include <iostream>
    #include <boost/array.hpp>
    #include <boost/asio.hpp>
    #include <boost/bind.hpp>
     
     
    using boost::asio::ip::udp;
    using namespace std;
     
     
    int main()
    {
        try{
        boost::asio::io_service io_service;
        udp::endpoint endpoint (boost::asio::ip::address::from_string("134.246.151.185"), 10001);
        boost::asio::socket_base::reuse_address option(true);
        udp::endpoint sender;
     
        udp::socket socket(io_service);
     
        socket.open(udp::v4());
        socket.set_option(option);
        socket.bind(endpoint);
     
     
        boost::array<char, 1024> recv_buf;
        size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender);
     
        std::cout.write(recv_buf.data(), len);
     
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
     
      return 0;
     
    }
    Voila

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

Discussions similaires

  1. il y a t-il une solution pour écouter sur un port utilisé ?
    Par dearraed dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 07/05/2013, 15h26
  2. ActiveX pour écouter un port UDP
    Par zalzasta dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 23/12/2010, 15h13
  3. librairie pour écouter le port parallèle
    Par Issam dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/05/2010, 18h58
  4. Réponses: 2
    Dernier message: 17/04/2007, 20h49
  5. Fonctions pour écouter le port série?
    Par KBNOT-PRC600 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 01/03/2006, 20h27

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