2017-09-25 36 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