使用boost库收听udp广播

Hug*_*ski 6 c++ sockets boost udp boost-asio

似乎是很多人都有的问题,但到目前为止我找到的所有答案都无济于事.

问题: 我正在尝试收听通过UDP将数据包发送到我的电脑的Velodyne HDL32.操作系统是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
Run Code Online (Sandbox Code Playgroud)

但是使用此代码,没有向我显示数据(端口是正确的):

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));
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,任何人都可以识别问题,还是需要更多信息?我感谢任何帮助.

注意: 我没有以root权限运行程序!

一些想法: boost :: asio :: ip :: address_v4 :: any()是否可能不会监听IP ..*.255有子网掩码255.255.255.0?

使用netcat时,也不会显示任何数据.当我使用Windows netcat时它工作得很好.与Linux和Windows上的Wireshark相同 - 工作正常.尝试了同样的,但效果相同 - 没有数据.

Hug*_*ski 2

感谢你们所有人努力帮助我。代码没问题,但问题出在 velodyne 及其网络设置方面。

对所有其他尝试使用 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。

我真不知道为什么这么复杂,但我们花了相当长的时间才发现这个“秘密”。希望你们中的一些人能从我们挑剔的工作中受益。