如何在特定网络接口上创建一个出站套接字?

24

我有一台服务器,拥有两个不同的网络接口,每个接口都有不同的IP地址。如何创建一个套接字,以便它将通过特定的IP地址发送数据?

我更喜欢Python的示例,但这个问题是语言无关的,所以可以使用任何语言。

编辑:请不要给我“你不能这样做”作为答案。我的意思是,这是一台计算机。我可以按照自己的意愿进行任何操作,例如-我可以在运行时编程地禁用其中一个我不想要的接口。我正在寻找更好的解决方案。

3个回答

16

您可以将套接字绑定到特定设备。

我不知道如何在Python中实现,但是使用伯克利套接字API(在C中)需要调用setsockopt()函数,使用选项SO_BINDTODEVICE

您需要传递一个接口描述符,它的类型为struct ifreq。理想情况下,您应该使用ioctl()获取接口描述符的内容,并请求SIOCGIFINDEX - 将接口名称(例如eth0)作为参数传递。


编辑:我刚刚进行了快速搜索,并找到了此处关于Python套接字方法的文档。其中包括setsockopt()方法。


仅适用于Linux系统。那OS X呢? - Dor

15

仅作一点提示 - 我真正需要的是绑定到特定的IP,只是为了完整起见,解决方案是在创建后绑定套接字。Python代码如下:

import socket
s = socket.socket()
s.bind(("127.0.0.1", 0))
s.connect(("321.12.131.432", 80))

1
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))

来自Quora的代码


3
没有“获取IP地址”的定义,这将无法运行。 - toth

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