我使用 C++ 创建了一个 UDP 套接字,同时提供 IPv4 地址和端口。我在 Ubuntu 上运行它,并且同时启动并运行了 wlan0 和 eth0 接口。显然有些东西决定了这两个接口都应该使用,我很感激。不过,使用不同的接口发送和接收确实为我创造了一种泡菜(NAT 遍历???)。使用 Wireshark 我可以看到包进来,但我的应用程序没有注册它们。
澄清:
我有一个跟踪器,它将为我提供一个同伴。跟踪器还将联系该对等方向我发送消息。为了克服 NAT 穿越问题,我将发送一个 puncture 消息。现在的问题是穿刺消息是通过 wlan 发送的(我正在用两台机器进行本地测试),而来自对等方的消息是通过 eth 发送的。
所以,我认为最简单的解决方案是简单地使用一个界面。(或两个一个插座)
编辑:
我将尝试这里提到的关于指定单个接口的内容。
@Barmar,指出当使用可以从中受益的目标地址调用 sendto 时,UDP 套接字可能会更改接口。不过,我对问题的原因仍然很模糊。有人可以首先解释为什么这是一个问题吗?
编辑2:
上面提到的为套接字绑定强制一个接口的解决方案不起作用。显然,sendto 方法会选择忽略这一点,如果觉得这样会更好,仍然会选择另一个接口。有谁知道如何确保套接字坚持分配给它的接口?