0

我使用 C++ 创建了一个 UDP 套接字,同时提供 IPv4 地址和端口。我在 Ubuntu 上运行它,并且同时启动并运行了 wlan0 和 eth0 接口。显然有些东西决定了这两个接口都应该使用,我很感激。不过,使用不同的接口发送和接收确实为我创造了一种泡菜(NAT 遍历???)。使用 Wireshark 我可以看到包进来,但我的应用程序没有注册它们。

澄清:

我有一个跟踪器,它将为我提供一个同伴。跟踪器还将联系该对等方向我发送消息。为了克服 NAT 穿越问题,我将发送一个 puncture 消息。现在的问题是穿刺消息是通过 wlan 发送的(我正在用两台机器进行本地测试),而来自对等方的消息是通过 eth 发送的。

所以,我认为最简单的解决方案是简单地使用一个界面。(或两个一个插座)

编辑:

我将尝试这里提到的关于指定单个接口的内容。

@Barmar,指出当使用可以从中受益的目标地址调用 sendto 时,UDP 套接字可能会更改接口。不过,我对问题的原因仍然很模糊。有人可以首先解释为什么这是一个问题吗?

编辑2:

上面提到的为套接字绑定强制一个接口的解决方案不起作用。显然,sendto 方法会选择忽略这一点,如果觉得这样会更好,仍然会选择另一个接口。有谁知道如何确保套接字坚持分配给它的接口?

4

1 回答 1

0

如果您需要确保 UDP 回复来自发送请求的同一地址,则解决方案是使用多个套接字。您为服务器的每个 IP 打开一个套接字(每个接口可能不止一个套接字,因为接口别名),并将套接字绑定到该 IP。然后您使用select()orpoll()立即等待所有套接字上的请求。当请求进入特定套接字时,您通过同一个套接字发送回复,其源 IP 将匹配原始数据包的目的地。

于 2013-10-21T15:09:47.317 回答