2012-09-21 27 views
0

我在python中實現了一個原始套接字程序,並且遇到了bind(),我可以將套接字綁定到接口。據我瞭解,這個函數的第一個字段是我想綁定的接口。 什麼是第二領域?這是Ethertype(如IP4)嗎?在Python的參考文檔中的raw socket example的代碼如下所示:python中原始套接字的bind()函數中的第二個字段

# 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.也許我錯過了/誤解這裏的東西。

回答

3

第二個字段表示您要綁定的端口號。然而,將它設置爲0,可以讓操作系統從範圍1024到65535中爲您選擇一個可用端口。

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

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


編輯:@highlycaffeinated指出,因爲socket.AF_INET地址族選擇上面的是真實的。但是,如果選擇socket.AF_INET6,則格式將爲(host, port, flowinfo, scopeid)

+0

+1。值得一提的是,這與原始套接字無關;對於流或數據報(TCP或UDP,對於INET系列)也是如此。 – abarnert

+0

+1這清除了我的東西。謝謝! – chembrad

+0

@chembrad很樂意幫助:) –

1

該值取決於您正在使用的地址族。對於您顯示的AF_INET,其端口號。從docs

套接字地址被表示爲如下:A單字符串用於 爲AF_UNIX地址族。一對(主機,端口)用於 AF_INET地址系列,其中host是代表「daring.cwi.nl」等因特網域表示法中的 主機名或諸如「100.50.200.5」之類的IPv4 地址的字符串,而端口是一個整數。對於AF_INET6 地址族,一個四元組(主機,端口flowinfo,scopeid)被使用,其中 和flowinfo表示scopeid和sin6_flowinfo sin6_scope_id 構件在結構中sockaddr_in6的C.對於插座模塊的方法, flowinfo和scopeid可以是爲了向後兼容而省略。 但是,請注意,省略scopeid可能導致在操作範圍內的IPv6地址時出現問題。其他地址系列當前不支持 。

+0

這是完全正確的,但它並沒有解釋端口0的特殊含義,這可能是OP的困惑。 – abarnert