2012-05-26 162 views
6

似乎是許多人都有的問題,但迄今爲止我找到的所有答案都無濟於事。使用增強庫收聽udp廣播

問題: 我想聽一個Velodyne HDL32,它通過UDP發送它的數據包到我的電腦。 該操作系統是32位Ubuntu和Boost庫v1.46。

我通過Wireshark的得到的數據是這樣的:

Time  | Source   | Destination | Protocol | Length | Source Port | Destination Port 
0.000000 | 192.168.17.212 | 192.168.3.255 | UDP  | 1248 | https  | opentable 

但有了這個代碼,沒有數據證明我(端口是正確的):

receiver(boost::asio::io_service& io_service, 
    const boost::asio::ip::address& listen_address) 
: m_socket(io_service) 
{ 

boost::asio::ip::address ipAddr = boost::asio::ip::address_v4::any(); 
boost::asio::ip::udp::endpoint listen_endpoint(
     ipAddr, 2368); 

m_socket.open(listen_endpoint.protocol()); 
m_socket.bind(listen_endpoint); 

m_socket.async_receive_from(
    boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

void handle_receive_from(const boost::system::error_code& error, 
    size_t bytes_recvd) 
{ 
std::cout << "receive" << bytes_recvd << std::endl; 


    m_socket.async_receive_from(
     boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
     boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

任何人都可以找出問題到目前爲止還是您需要更多信息? 我感謝任何幫助,我可以得到。

注意: 我沒有運行root權限的程序!

的幾點思考: 難道是可能的boost :: ASIO ::知識產權:: address_v4 ::任何()將不聽IP 。*。255具有子網掩碼255.255.255.0時?

使用netcat時,也不會顯示數據。當我使用Windows netcat時,它工作得很好。與Linux和Windows上的Wireshark相同 - 工作正常。 試了一下,但效果相同 - 沒有數據。

+0

應用程序是否向您發送多播數據?如果是這樣,請嘗試不綁定到監聽端點。 – Chad

+0

你叫過io_service :: run()嗎?你只顯示了你的代碼片段,所以我必須問。 – Sean

+0

@Sean io_service.run()在主函數中被調用。該程序在接收特定IP和特定端口上的數據時工作正常。但是當我試圖收聽廣播時沒有收到數據 –

回答

2

謝謝大家,你們試圖幫助我。代碼沒問題,但問題出在了陀思妥和網絡設置上。

解釋誰試圖用Velodyne工作的所有其他人:

的velodyne有它自己的子網(192.168.17.x)。所有記錄的數據現在通過廣播發送到子網192.168.3.x。在正常情況下,應該在該子網中的所有IP上收到數據,但這似乎是不可能的。您可以接收數據的唯一IP是IP 255,只要您使用這兩種解決方案中的一種即可。 (或使用Windows或轉儲使用Wireshark的文件)

1.愚蠢的,但工作溶液

設置一個網關192.168.3.1。是的,沒有,但沒關係。從現在起一個,您將收到的IP 255

2.清潔液

設置新的路徑,導致所有流量從velodyne的子網到子網192.168.3.x.數據

我真的不知道爲什麼它如此複雜,但我們花了相當一段時間才發現這個「祕密」。希望你們中的一些人能從我們挑剔的工作中獲利。

0

您是否嘗試過設置廣播選項?

// do this before binding 
boost::asio::socket_base::broadcast option(true); 
m_socket.set_option(option); 
+0

thx BatchyX的答案,但是當我看到這個選項時說: 「套接字選項允許發送廣播消息。」 但我需要接收數據不發送任何。 –

+0

對我來說,源代碼表示它啓用了SO_BROADCAST,這在Linux上是必需的以接收廣播數據。 – BatchyX