C++ 使用Boost.Asio将UDP套接字绑定到特定的网络接口

C++ 使用Boost.Asio将UDP套接字绑定到特定的网络接口,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我的电脑有几个网卡,我正在尝试从几个广播设备接收UDP数据。每个设备都在专用网络上隔离,我试图同时从多个设备读取UDP数据。我使用的是Boost版本1.67。让我们在这篇文章中假设我只想从一个特定的设备获取数据,所以我想绑定到一个本地网络接口上 在Windows上,下面的代码可以工作,但在我的Ubuntu 16.04 64位机器上却不行。实际上,如果绑定到一个特定的本地IP地址(本例中为192.168.1.1),则不会获得任何数据。但是如果我使用任何“0.0.0.0”地址,那么我就得到了我想要的

我的电脑有几个网卡,我正在尝试从几个广播设备接收UDP数据。每个设备都在专用网络上隔离,我试图同时从多个设备读取UDP数据。我使用的是Boost版本1.67。让我们在这篇文章中假设我只想从一个特定的设备获取数据,所以我想绑定到一个本地网络接口上

在Windows上,下面的代码可以工作,但在我的Ubuntu 16.04 64位机器上却不行。实际上,如果绑定到一个特定的本地IP地址(本例中为192.168.1.1),则不会获得任何数据。但是如果我使用任何“0.0.0.0”地址,那么我就得到了我想要的。除非那样的话,我不知道它是从哪里来的。它可以被任何网卡接收

这是正常的行为吗?或者我需要阅读
sender\u endpoint
来了解Linux上的信息,然后进行过滤吗

#包括
#包括
#包括
使用boost::asio::ip::udp;
int main(int argc,char*argv[])
{
尝试
{
boost::asio::io_上下文io_上下文;
//设置UDP套接字
udp::套接字(io_上下文);
socket.open(udp::v4());
//绑定到特定网卡和所选端口
绑定(udp::endpoint(boost::asio::ip::address::from_string(“192.168.1.1”),2368));
//准备接收数据
boost::数组recv_buf;
udp::端点发送方\端点;
size\u t len=socket.receive\u from(boost::asio::buffer(recv\u buf),sender\u端点);
//将数据写入std输出
std::cout.write(recv_buf.data(),len);
}
捕获(标准::异常&e)
{

std::cerr有点晚了,但其他人可能会这么做,因为我一直在尝试使用Boost,并试图弄清楚它是如何工作的。通过回顾这个问题:我转到了这个页面:在Linux上,您需要绑定到“任意地址”以便接收广播数据包。因此,您可以将其设置为您的接收端点:

udp::endpoint(boost::asio::ip::address_v4::any(), port)

然后是的,你需要过滤发件人信息。这似乎有点奇怪,但似乎是Linux接口处理广播的方式。

下一步我会尝试使用wireshark或其他类似工具来监听网络流量。你检查过了吗,在Ubuntu下,该卡的静态ip是否与Windows下的相同?你也可以尝试一个非常高的ip地址端口号像56789,我想我记得,有些Linux需要su来支持下面的端口…我不记得@πάνταῥεῖ 已经这样做了。我有一个PCAP记录,它只显示正常的广播流量。@nada我想你指的数字是1024。IP地址相同,全局设置也相同。如果我绑定到ANY接口,我可以读取该端口2368上的数据,所以我不确定你的观点在我的情况下是否有意义。