2017-09-06 74 views
2

在Python中,當我們想製作監聽組播流量的腳本時,我們將套接字的IP_ADD_MEMBERSHIP選項設置爲由多播組地址和本地接口的地址組成的值它會監聽該組的流量。Python套接字IP_ADD_MEMBERSHIP和INADDR_ANY混淆

在互聯網上的許多例子傳給IP_ADD_MEMBERSHIPINADDR_ANY通配符地址爲本地接口,以及他們的一些指出,這將使插座上所有接口,多播數據包監聽。然而,Linux的IP(7)手冊頁指出,使用INADDR_ANY

和FreeBSD的手冊頁「適當的接口是由系統選擇了」說,它會選擇「默認界面」。

所以,無論是一些在線答案是錯誤的,或有一些我在這裏失蹤。我相信INADDR_ANY作爲IP_ADD_MEMBERSHIPINADDR_ANY中的參數被用作bind()(由空字符串表示)中的參數時會出現混淆,但我並不確定。有人可以澄清在IP_ADD_MEMBERSHIP中使用INADDR_ANY0.0.0.0時發生了什麼(即它選擇了默認接口或所有接口),並且在與bind一起使用時的行爲有所不同嗎?

回答

2

INADDR_ANY給出一個bind電話的地址,這將導致套接字來偵聽給定端口任何網絡接口上。

以這種方式調用bind後,你會看到這樣的條目在netstat命令的輸出:

udp  0  0 0.0.0.0:46162   0.0.0.0:* 

這是一個註定要與INADDR_ANY端口UDP套接字46162.

當設置IP_ADD_MEMBERSHIP選項時用作接口地址時,INADDR_ANY表示操作系統將選擇一個接口加入給定的多播組,即「默認」網絡接口。

它的確如此而不是意味着它將在所有接口上加入組。爲此,您需要遍歷所有網絡接口並在每個接口上設置IP_ADD_MEMBERSHIP選項。

我已經使用Linux,Solaris,FreeBSD和Windows,並且在使用INADDR_ANY時,它們都沒有在所有接口上加入多播組。

+0

謝謝,這爲我清理了一些東西 – AndroidX