2017-09-25 50 views
3

我想使用多播接收器的示例来侦听通过网络发送UDP多播数据的应用程序。多播接收器与升压C + +看不到数据

  • 听音IP是193.xx107
  • 发件人IP是193.xx109
  • 组播地址是231.11.1.5:6005

下面是数据的采集Wireshark的,以确保数据被传递:

Proof of Traffic

这里是来回的代码m助推库:

// 
// 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; 
} 

问题是数据通过而不被套接字看到,虽然Wireshark可以看到它们。

我试图以root身份运行套接字,但没有取得更多的成功。

会有人知道这段代码是错误的吗?

回答

-1

我曾尝试例如从网站:

而且一切看起来工作得很好。 什么更确切地打扰你?

0

谢谢你试图帮助我。事实上,来自网站的例子工作正常。

我想捕获另一个应用程序发送的流量(看看wireshark屏幕截图)。请注意,193.x.x.109不会运行sender.cpp,但会发送其他数据。看看下面的小图:

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

如果这很重要,这些数据是二进制的(不是字符串)。

tcpdump命令的当量将是:

tcpdump -i bond1 dst port 6005