【发布时间】:2019-09-05 04:33:25
【问题描述】:
我的电脑有多个网卡,我正尝试从多个广播设备接收 UDP 数据。每个设备都隔离在专用网络上,我试图同时从多个设备读取 UDP 数据。我正在使用 Boost 1.67 版。让我们在这篇文章中假设我只想从一个特定设备获取数据,所以我想绑定到本地网络接口。
以下代码在 Windows 上有效,但在我的 Ubuntu 16.04 64 位机器上却不行。事实上,如果我绑定到一个特定的本地 IP 地址(本例中为 192.168.1.1),我不会得到任何数据。但如果我使用任何“0.0.0.0”地址,我就会得到我想要的。除了在那种情况下我不知道它来自哪里。任何网卡都可以接收!
这是正常行为吗?还是我需要阅读sender_endpoint 以了解有关 Linux 的信息并在之后进行过滤?
#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;
}
【问题讨论】:
-
下一步我会尝试使用wireshark或一些类似工具来嗅探网络流量。
-
您是否检查过,在 Ubuntu 下,该卡是否具有与 Windows 下相同的静态 IP?你也可以尝试一个非常高的端口号,比如 56789,我想我记得,有些 Linux 需要 su 用于下面的端口......我不记得了
-
@πάνταῥεῖ 已经这样做了。我有一个 PCAP 记录,它只显示广播正常流量。 @nada 我认为您指的数字是 1024。IP 地址相同,全局设置也相同。如果我绑定到 ANY 接口,我可以读取该端口 2368 上的数据,因此不确定您的观点对我来说是否有意义。
标签: c++ sockets boost boost-asio