如何为特定网络接口创建传出套接字?

Posted

技术标签:

【中文标题】如何为特定网络接口创建传出套接字?【英文标题】:How do I make an outgoing socket to a SPECIFIC network interface? 【发布时间】:2010-09-25 00:53:24 【问题描述】:

我的服务器有两个不同的网络接口,每个接口都有不同的 IP 地址。我怎样才能创建一个套接字,让它输出一个特定的 IP 地址?

我更喜欢 python 示例,但问题与语言无关,所以赶紧走吧。

编辑:请不要给我“你不能”作为答案。我的意思是,它是一台计算机。例如,我可以做任何我喜欢的事情 - 我可以通过编程方式即时禁用我不想要的一个界面。我正在寻找更漂亮的东西。

【问题讨论】:

【参考方案1】:

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

我不知道如何在 python 中执行此操作,但使用 berkeley socket api(在 C 中)您需要调用 setsockopt(),使用选项 SO_BINDTODEVICE

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


编辑:刚刚快速搜索并找到了this python 中套接字方法的文档。 setsockopt() 就是其中之一。

【讨论】:

仅适用于 Linux。 OS X 呢?【参考方案2】:

请注意——我真正需要的是绑定到特定的 IP,为了完整起见,解决方案是在创建后绑定套接字。 python中的源码:

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

【讨论】:

【参考方案3】:
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))

来自Quora

【讨论】:

如果没有 get_ip_address 的定义,这将无法工作

以上是关于如何为特定网络接口创建传出套接字?的主要内容,如果未能解决你的问题,请参考以下文章

为 WININET HTTP 请求使用特定的网络接口

如何为包含特定函数数组的 JSON 对象编写接口

如何将多个传出IP地址分配给AWS上的单个实例?

如何告诉 Qt Network 更改传出网络接口? [复制]

《计算机网络原理》网络应用通信基本原理

如何为CentOS 7配置静态IP地址