簡體   English   中英

python中原始套接字的bind()函數中的第二個字段

[英]Second field in the bind() function for raw sockets in python

我正在用python實現一個原始套接字程序,遇到了bind() ,我可以在其中將套接字綁定到接口。 據我了解,此功能的第一個字段是我希望綁定的接口。 什么是第二場? 這是以太網類型(例如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。也許我在這里缺少/誤解了一些東西。

第二個字段指示您要綁定到的端口號。 但是將其設置為0,將允許操作系統為您選擇一個可用端口,范圍從1024到65535。

然后,您可以獲取sock.getsockname()[1]選擇的端口。

同樣,將第一個字段(主機)設置為0.0.0.0''將允許接受來自任何IPv4地址的連接。


編輯:正如@highlycaffeinated所指出的,上述事實是正確的,因為選擇了socket.AF_INET地址族。 然而,如果socket.AF_INET6被選擇,格式將是(host, port, flowinfo, scopeid)

該值取決於您使用的地址系列。 對於您顯示的AF_INET ,其端口號。 文檔

套接字地址表示如下:AF_UNIX地址系列使用單個字符串。 AF_INET地址族使用一對(主機,端口),其中host是一個字符串,該字符串表示Internet域表示法中的主機名(如“ daring.cwi.nl”)或IPv4地址(如“ 100.50.200.5”),而port為一個整數。 對於AF_INET6地址族,使用四元組(主機,端口,flowinfo,scopeid),其中flowinfo和scopeid代表C語言中struct sockaddr_in6中的sin6_flowinfo和sin6_scope_id成員。對於套接字模塊方法,可以僅向后省略flowinfo和scopeid兼容性。 但是請注意,省略scopeid可能會導致在處理作用域IPv6地址時出現問題。 當前不支持其他地址族。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM