我在python中实现了一个原始套接字程序,我遇到了bind()
,我可以将套接字绑定到接口。据我了解,这个函数的第一个字段是我想要绑定的接口。 第二个字段是什么?这是Ethertype(例如IP4)吗?在Python参考文档中找到的raw socket example中,代码如下所示:
# 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))
为什么第二个字段为零?在其他examples我已经看到它经常被设置为0x0800(或十进制的2048),这使我相信这可能将套接字设置为IP4协议。我也看到这个设置为9999.也许我在这里错过/误解了一些东西。
答案 0 :(得分:3)
第二个字段表示您要绑定的端口号。将其设置为0但是,让操作系统从1024到65535范围内为您选择一个可用端口。
然后,您可以获取sock.getsockname()[1]
选择的端口。
此外,将第一个字段(主机)设置为0.0.0.0
或''
将允许接受来自任何IPv4地址的连接。
编辑:正如@highlycaffeinated指出的那样,上面的描述是正确的,因为选择了socket.AF_INET
地址族。但是,如果选择socket.AF_INET6,则格式为(host, port, flowinfo, scopeid)
。
答案 1 :(得分:1)
该值取决于您使用的地址系列。对于您显示的AF_INET
,其端口号。来自docs:
套接字地址表示如下:使用单个字符串 对于AF_UNIX地址系列。一对(主机,端口)用于 AF_INET地址族,其中host是表示a的字符串 Internet域符号中的主机名,如“daring.cwi.nl”或IPv4 地址类似于'100.50.200.5',port是一个整数。对于AF_INET6 地址族,使用四元组(主机,端口,流信息,scopeid), 其中flowinfo和scopeid表示sin6_flowinfo和sin6_scope_id C中struct sockaddr_in6中的成员。对于套接字模块方法, 为了向后兼容,可以省略flowinfo和scopeid。 但请注意,省略scopeid可能会导致操作问题 范围内的IPv6地址。其他地址系列目前不是 支撑。