2017-09-25 2 views
3

J'essaie d'utiliser l'exemple du récepteur Multicast pour écouter l'application qui envoie des données UDP Multicast sur le réseau.Récepteur multicast avec boost C++ ne voyant pas de données

  • L'IP d'écoute est 193.xx107
  • L'IP de l'expéditeur est 193.xx109
  • adresse Multicast est 231.11.1.5:6005

Voici une capture Wireshark des données , pour vous assurer que les données passent par:

Proof of Traffic

Voici le code vient m bibliothèque Boost:

// 
// receiver.cpp 
// ~~~~~~~~~~~~ 
// 
// Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com) 
// 
// Distributed under the Boost Software License, Version 1.0. (See accompanying 
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
// 

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
#include "boost/bind.hpp" 

const short multicast_port = 6005; 

class receiver 
{ 
     public: 
     receiver(boost::asio::io_service& io_service, 
     const boost::asio::ip::address& listen_address, 
     const boost::asio::ip::address& multicast_address) 
     : socket_(io_service) 
{ 
    // Create the socket so that multiple may be bound to the same   address. 
    boost::asio::ip::udp::endpoint listen_endpoint(listen_address, multicast_port); 
    socket_.open(listen_endpoint.protocol()); 
    socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
    socket_.bind(listen_endpoint); 

    std::cout << "Socket Created : " << std::endl; 

    // Join the multicast group. 
    socket_.set_option(
     boost::asio::ip::multicast::join_group(multicast_address)); 

    socket_.async_receive_from(
     boost::asio::buffer(data_, max_length), sender_endpoint_, 
     boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 

    std::cout << "Mutilcast Group Joined : " << std::endl; 
} 

void handle_receive_from(const boost::system::error_code& error, 
    size_t bytes_recvd) 
{ 
    if (!error) 
    { 
     std::cout.write(data_, bytes_recvd); 
     std::cout << std::endl; 

     socket_.async_receive_from(
       boost::asio::buffer(data_, max_length), sender_endpoint_, 
       boost::bind(&receiver::handle_receive_from, this, 
       boost::asio::placeholders::error, 
       boost::asio::placeholders::bytes_transferred)); 
    } 
} 

private: 
    boost::asio::ip::udp::socket socket_; 
    boost::asio::ip::udp::endpoint sender_endpoint_; 
    enum { max_length = 1024 }; 
    char data_[max_length]; 
}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     if (argc != 3) 
     { 
      std::cerr << "Usage: receiver <listen_address> <multicast_address>\n"; 
      std::cerr << " For IPv4, try:\n"; 
      std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; 
      std::cerr << " For IPv6, try:\n"; 
      std::cerr << " receiver 0::0 ff31::8000:1234\n"; 
      return 1; 
     } 

     boost::asio::io_service io_service; 
     receiver r(io_service, 
       boost::asio::ip::address::from_string(argv[1]), 
       boost::asio::ip::address::from_string(argv[2])); 

    std::cout << "Starting listening... " << std::endl; 
    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << "Exception: " << e.what() << "\n"; 
} 

return 0; 
} 

Le problème est que les données passent sans être vu par la prise bien que Wireshark puisse les voir.

J'ai essayé d'exécuter le socket en tant que root sans beaucoup plus de succès.

Quelqu'un sait-il si ce code est faux?

Répondre

-1

J'ai essayé l'exemple du site:

Et tout semble très bien fonctionner. Qu'est-ce qui vous dérange le plus?

0

merci d'avoir essayé de m'aider. En effet l'exemple du site fonctionne bien. J'essaye de capturer le trafic envoyé par une autre application (regardez la capture d'écran de wireshark). Notez que 193.x.x.109 n'exécute pas le fichier sender.cpp mais envoie d'autres données. Regardez le petit diagramme ci-dessous:

193.x.x.109 ------------------------------Multicast data -------------> 231.11.1.5:6005 
               | 
193.x.x.107 -(Running receiver.cpp)--------------| 

Ces données sont binaires (pas de chaîne) si c'est important.

L'équivalent de commande tcpdump serait:

tcpdump -i bond1 dst port 6005