我需要创建两个套接字,它们监听同一个IP:端口,但在不同的接口上:
现在,这对我来说实际上是有道理的,因为唯一指定网络接口的时刻是加入多播组
我尝试过将套接字绑定到多播地址和端口,这会像上面提到的那样行为。我尝试将其绑定到接口地址,但在Linux上无法工作(似乎在Windows上可以),您不会在套接字上接收任何流量。最后,我尝试将其绑定到
我不能使用
所以我想知道是否可能实现这一点。如果无法完成,则没关系,我会将其视为答案并继续前进,我只是无法找到任何解决方法。哦,我已将问题标记为
- socket0在eth0接口上接收发送到224.2.2.2:5000的UDP流量
- socket1在eth1接口上接收发送到224.2.2.2:5000的UDP流量
现在,这对我来说实际上是有道理的,因为唯一指定网络接口的时刻是加入多播组
setsockopt(socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,...)
和ip_mreq.imr_interface.s_addr
。我认为这指定了哪个接口加入组,但与套接字从哪个接口接收无关。我尝试过将套接字绑定到多播地址和端口,这会像上面提到的那样行为。我尝试将其绑定到接口地址,但在Linux上无法工作(似乎在Windows上可以),您不会在套接字上接收任何流量。最后,我尝试将其绑定到
INADDR_ANY
,但这不是我想要的,因为我将接收发送到该端口的任何其他数据,而不管目标IP,例如单播,它仍然不会阻止来自其他接口的多播数据。我不能使用
SO_BINDTODEVICE
,因为它需要root权限。所以我想知道是否可能实现这一点。如果无法完成,则没关系,我会将其视为答案并继续前进,我只是无法找到任何解决方法。哦,我已将问题标记为
C
,因为这是我们正在使用的语言,但我认为它可能并不特定于该语言。
我没有包含这个代码,因为我认为这更像是一个理论问题,而不是源代码的问题。我们已经使用套接字(多播或其他)工作了一段时间,没有任何问题,只是这是我们第一次处理多个接口。但如果你认为这可能有所帮助,我可以写一些最小化的工作示例。
关于可能的重复问题的编辑:
我认为我正在尝试实现的用例是不同的。套接字应该只从一个特定的接口接收来自相同的多播组和端口(如上例中的224.2.2.2:5000),而不是从两个接口同时接收数据。换句话说,两个接口都从同一个多播组接收数据(但是不同的网络,因此数据不同),我需要每个套接字仅在一个接口上监听。
我认为那个问题涉及同一端口上的多个组,而不是来自不同接口的同一组。除非有什么我没有看到的东西,可能真的可以帮助我解决这个问题。