似乎是很多人都有的问题,但到目前为止我找到的所有答案都无济于事。
问题: 我正在尝试收听通过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
但是使用此代码,我没有显示任何数据(端口是正确的):
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权限运行程序!
一些想法: 当有子网掩码255.255.255.0时,boost :: asio :: ip :: address_v4 :: any()是否有可能不会侦听IP 。。*。255?
使用netcat时,也不会显示任何数据。当我使用Windows netcat时它工作得很好。与Linux和Windows上的Wireshark相同 - 工作正常。 也尝试了它,但效果相同 - 没有数据。
答案 0 :(得分: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的所有流量。
我真的不知道为什么它如此复杂,但我们花了很长时间才发现这个“秘密”。希望你们中的一些人能从我们挑剔的工作中获益。
答案 1 :(得分:0)
您是否尝试过设置广播选项?
// do this before binding
boost::asio::socket_base::broadcast option(true);
m_socket.set_option(option);