如果我使用 0.0.0.0 以外的地址,则无法接收 UDP 数据报:在我的计算机主板上的第二个以太网接口上

如果我使用 0.0.0.0 以外的地址,则无法接收 UDP 数据报:在我的计算机主板上的第二个以太网接口上

我在一块带有两个有线以太网接口(称为 LAN1 (192.168.1.101) 和 LAN2 (192.168.2.1))的主板上运行 Ubuntu 22.04。我是 Linux 开发新手,我在执行环境中使用 .NET 6 运行时。这些东西可以正常工作,至少看起来是这样。这不涉及 WLAN/WiFi。

我想使用 LAN1 连接到我的家庭网络,访问互联网等。我有一些设备使用 UDP 广播发送遥测数据。目的是让流量到达 LAN2,然后接收应用程序可以抓取数据,对其进行处理,并最终通过 LAN1 发送一些数据。

我尝试做的一件事是只监听和处理 LAN2 接口上的 UDP 流量。如果 LAN1 接口上有东西进来,我不想知道。

查找了如何创建一个简单的 UDP 侦听器,并有两个版本的测试代码。一个使用 UdpClient;另一个使用套接字。这些都是基本的 Microsoft Learn/CodeProject 类型的测试程序。在 VS 2022 中创建了针对 net6.0 的代码。

基本上,示例代码显示创建一个基本上为 0.0.0.0 的 IPAddress,添加我的端口,然后创建并监听。处理传入的字节。进一步调查(即 Google)关于将工作限制在一个接口上,建议使用 192.168.2.1(即我感兴趣的接口的静态 IP)创建 IPAddress,添加端口,然后创建并监听。

测试代码的主要部分是这样的:

_listenEP = new IPEndPoint(IPAddress.Parse("192.168.2.1"), _port);
_listener = new UdpClient(_listenEP);
_groupEP = new IPEndPoint(IPAddress.Any, _port);

while (true)
{
    Console.WriteLine($"{Environment.NewLine}Waiting for broadcast  {DateTime.Now}");
    byte[] bytes = _listener.Receive(ref _groupEP);
    Console.WriteLine($"Received broadcast from {_groupEP} :");
    ProcessData(bytes);
}

如果第一个 IP 地址是 0.0.0.0,那么我会看到流量并且会处理它,但可以从任一接口处理。

结果:如果我在具有多个有线接口的 Windows 11 笔记本电脑上运行代码,我似乎能够做我想做的事情。如果我从 0.0.0.0 开始,那么我会看到 UDP 数据报从多个接口进入(通过我的处理代码和使用 Wireshark 观察网络流量)。如果我限制为单个 IP 地址,那么我的数据报处理例程只会针对该特定接口上的流量触发。太棒了。

但是...如果我将相同的代码移到我的 Ubuntu 主板并运行它,一切对于 0.0.0.0 都有效(但跨越 LAN1 和 LAN2)。如果我启动例程以绑定到 192.168.2.1(LAN2),那么我看不到任何流量 - 没有进行任何处理,但 Wireshark 确实显示该接口上存在 UDP 数据报。

那么...有人能建议我忽略的“将我的程序绑定到一个接口”吗?某种网络路由或配置对于仅在特定接口上收听 UDP 流量很重要吗?

谢谢。

相关内容