簡體   English   中英

套接字未加入多播組,但可以接收數據。

[英]A socket didn't join a multicast group but it can receive data.

當我創建兩個udp套接字並將它們綁定到INADDR_ANY和相同的端口號時。 但其中一人加入了一個組播組。 但是它們都可以從同一個組播組接收數據,即使其中一個套接字沒有加入組播組。

Linux內核不跟蹤IGMP連接的狀態。 IGMP是路由器協議。 將IGMP加入發送到多播組只是告訴路由器它應該將數據包轉發到給定的地址和端口。 請注意,路由器必須能夠與IGMP通信。

這意味着雖然您使用setsockopt()來加入多播組,但內核不會按照您的預期跟蹤每個套接字的成員資格。 內核只是向路由器發送IGMP加入數據包。 您可以使用wireshark或其他任何方式驗證這一點。

由於內核不跟蹤套接字的IGMP狀態,因此該地址和端口上的傳入流量只是內核的“常規”流量。

因此,如果您將兩個套接字綁定到相同的地址和端口,然后使用該地址和端口發送了IGMP連接,則預期的行為是數據包將在兩個套接字上可用。

BTW:為什么你需要兩個套接字綁定到同一個地址和端口?

更新:根據@Ambroz Bizjak的解釋(謝謝),Linux內核不跟蹤IGMP連接的狀態是不正確的。 確實如此。 但是,如果多個套接字綁定到同一個地址和端口,它不會使用此信息來決定應將哪些數據包轉發到哪個套接字。

內核根本不根據套接字所屬的組播組過濾傳入的組播數據包。 如果未向組添加套接字,則如果同一系統上的其他套接字是成員,則它仍可能會向組發送多播。 (我不確定如果組播到達會發生什么,但沒有套接字是成員。你可以測試你是否喜歡。)

請注意,內核實際上確實跟蹤了每個套接字的組所有權。 它必須或者無法正確實現IGMP協議的客戶端。 例如,內核需要回復來自路由器的各種IGMP查詢(在那里詢問主機加入哪些組),並且還知道在沒有更多套接字連接到的情況下發送離開組消息。一個特定的群體。

暫無
暫無

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

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