【问题标题】:Bind UDP socket to specific network interface using Boost.Asio使用 Boost.Asio 将 UDP 套接字绑定到特定的网络接口
【发布时间】: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


【解决方案1】:

有点晚了,但其他人可能会想到这一点,而我一直在尝试使用 Boost 并试图弄清楚它是如何工作的。通过查看这个问题:Fail to listen to UDP Port with boost::asio 我去了这个页面:https://forums.codeguru.com/showthread.php?504427-boost-asio-receive-on-linux,事实证明,在 Linux 上,您需要绑定到“任何地址”才能接收广播数据包。因此,您可以将其设置为接收端点:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2016-01-15
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多