单套接字通过 WLAN 和 ETH 接口发送和接收

Single socket sends and receives over both wlan and eth interface

本文关键字:接口 ETH WLAN 套接字      更新时间:2023-10-16

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

澄清一下:

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

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

编辑:

我将尝试此处提到的指定单个接口的内容。

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

编辑2:

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

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