我的电脑有几个网络卡,我试图从多个广播设备接收UDP数据。每个设备都在专用网络上隔离开来,我正在尝试同时从多个设备读取UDP数据。 我使用的是Boost版本1.67。在这篇文章中,假设我只想从一个特定的设备获取数据,因此我想在本地网络接口上进行绑定。
在Windows上,以下代码可以工作,但是在我的Ubuntu 16.04 64位机器上无法工作。实际上,如果我绑定到一个特定的本地IP地址(例如192.168.1.1),我就无法获取任何数据。但是,如果我使用ANY "0.0.0.0"地址,那么我就可以得到我想要的东西。除了这种情况下,我不知道它来自哪里。它可能被任何网络卡接收!
这是正常行为吗?还是我需要在Linux上读取sender_endpoint
以获取该信息,然后进行过滤?
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::udp;
int main(int argc, char* argv[])
{
try
{
boost::asio::io_context io_context;
// Setup UDP Socket
udp::socket socket(io_context);
socket.open(udp::v4());
// Bind to specific network card and chosen port
socket.bind(udp::endpoint(boost::asio::ip::address::from_string("192.168.1.1"), 2368));
// Prepare to receive data
boost::array<char, 128> recv_buf;
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
// Write data to std output
std::cout.write(recv_buf.data(), len);
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}