1

我正在用 python 实现一个原始套接字程序,我遇到了bind()可以将我的套接字绑定到接口的地方。据我了解,此函数的第一个字段是我希望绑定到的接口。 第二个领域是什么?这是 Ethertype(例如 IP4)吗?在 Python 参考文档中找到的原始套接字示例中,代码如下所示:

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

为什么第二个字段为零?在其他示例中,我看到这经常设置为 0x0800(或十进制的 2048),这让我相信这可能会将套接字设置为 IP4 协议。我也看到这个设置为 9999。也许我在这里遗漏/误解了一些东西。

4

2 回答 2

3

第二个字段表示您要绑定的端口号。但是,将其设置为 0,将使操作系统为您选择一个从 1024 到 65535 的可用端口。

然后,您可以获得 选择的端口sock.getsockname()[1]

此外,将第一个字段(主机)设置为0.0.0.0''将允许接受来自任何 IPv4 地址的连接。


编辑:正如@highlycaffeinated 所指出的,以上是正确的,因为socket.AF_INET选择了地址族。但是,如果选择了socket.AF_INET6,则格式将为(host, port, flowinfo, scopeid).

于 2012-09-21T16:53:52.360 回答
1

该值取决于您使用的地址系列。就像你展示的AF_INET那样,它的端口号。从文档

套接字地址表示如下: 单个字符串用于 AF_UNIX 地址族。AF_INET 地址族使用一对 (host, port),其中 host 是一个字符串,表示 Internet 域表示法中的主机名,如“daring.cwi.nl”或 IPv4 地址,如“100.50.200.5”,端口为一个整数。对于AF_INET6地址族,使用四元组(host、port、flowinfo、scopeid),其中flowinfo和scopeid分别代表C语言struct sockaddr_in6中的sin6_flowinfo和sin6_scope_id成员。对于socket模块方法,flowinfo和scopeid可以省略,只是为了向后兼容性。但是请注意,省略 scopeid 可能会导致在处理作用域 IPv6 地址时出现问题。目前不支持其他地址族。

于 2012-09-21T16:53:57.117 回答