如何将套接字绑定到多个接口

28
在网上搜索了几个小时后,我仍然无法找到我的问题的答案。
我的任务是创建一个服务器,可以接受来自各种接口的套接字(在配置文件中给出为eth0、eth1等)。
有没有一种最简单的方法来实现这个目标呢?是否有办法将一个套接字绑定到多个接口?我还没有找到这样的方法。
或者,我必须使用INADDR_ANY并找出发送数据包的接口?
有没有其他方法来解决这个问题?
2个回答

39

您可以使用bind(2)将一个套接字绑定到所有接口,使用INADDR_ANY,或者创建多个套接字,并将每个套接字绑定到所需接口的IP地址。无论哪种情况,都要在套接字上设置SO_REUSEADDR选项。


@NikolaiNFetissov 当我使用INADDR_ANY时,我能否接受超过65K的连接限制,还是我必须分别绑定每个IP? - Etherealone
5
@Tolga,你可能是指TCP端口号是一个16位整数这一事实。但这并不是限制因素,因为每个给定的TCP连接都是一个4元组(源地址、源端口、目标地址、目标端口)。在达到65536个连接之前,你更有可能在服务器上达到每个进程文件描述符的限制。 - Nikolai Fetissov
@NikolaiFetissov 感谢您提供这个清晰的答案。很可能,使用多个套接字的第二种选项需要更多的编程工作,因为我们需要在多个套接字上监听和检查连接(可能使用C中的select)。第一种选项对应用程序似乎是透明的,所以在我看来更容易编程。您同意吗?在什么情况下我们会选择第二个选项? - flow2k
在您的主机连接到不同网络时需要不同的行为(例如代理等)的情况下。 - Nikolai Fetissov

0
听起来你想创建一个可以在多个接口上监听的套接字。你需要知道你的源IP地址(即分配给每个接口的地址),以及你的数据包的目标IP地址和端口。然后为每个套接字配置IP_MULTICAST_IF和IP_ADD_MEMBERSHIP属性。以下是一些示例Python代码:
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.bind((dst_ip, port))

for src_ip in src_ips:
    sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(src_ip))
    sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(dst_ip) + socket.inet_aton(src_ip))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接