3 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個贊
在接收多播時綁定UDP套接字意味著指定從中接收數(shù)據(jù)的地址和端口(不是本地接口,TCP接受器綁定就是這種情況)。在這種情況下,指定的地址具有過濾作用,即,套接字將僅接收發(fā)送到該多播地址和端口的數(shù)據(jù)報,而不管套接字隨后加入了什么組。這就解釋了為什么綁定到INADDR_ANY(0.0.0.0)時,我會收到發(fā)送到多播組的數(shù)據(jù)報,而綁定到任何本地接口時,我卻什么都沒收到,即使數(shù)據(jù)報是在與該接口相連的網(wǎng)絡(luò)上發(fā)送的也是如此對應(yīng)。
引自UNIX Stevens的網(wǎng)絡(luò)編程第1卷,第三版:套接字網(wǎng)絡(luò)API。21.10。發(fā)送和接收
[...]我們希望接收套接字綁定多播組和端口,例如239.255.1.2端口8888。(回想一下,我們可以只綁定通配符IP地址和端口8888,但是綁定多播地址會阻止套接字接收可能到達(dá)端口8888的任何其他數(shù)據(jù)報。)然后,我們希望接收套接字加入多播組。發(fā)送套接字將數(shù)據(jù)報發(fā)送到該相同的多播地址和端口,例如239.255.1.2端口8888。

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個贊
綁定多播(udp)套接字是什么意思的更正?只要在以下引用中部分正確:
“綁定”操作的基本意思是,“使用此本地UDP端口發(fā)送和接收數(shù)據(jù)。換句話說,它將分配該UDP端口供您的應(yīng)用程序?qū)S谩?/p>
有一個例外。如果應(yīng)用了該選項(xiàng),則多個應(yīng)用程序可以共享同一端口進(jìn)行偵聽(通常對于多播數(shù)據(jù)報具有實(shí)用價值)SO_REUSEADDR。例如
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // create UDP socket somehow
...
int set_option_on = 1;
// it is important to do "reuse address" before bind, not after
int res = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &set_option_on,
sizeof(set_option_on));
res = bind(sock, src_addr, len);
如果多個進(jìn)程進(jìn)行了這種“重用綁定”,則在該共享端口上接收到的每個UDP數(shù)據(jù)報都將傳遞到每個進(jìn)程(提供與多播流量的自然聯(lián)合)。
以下是有關(guān)在某些情況下會發(fā)生什么的更多詳細(xì)信息:
嘗試將任何綁定(“獨(dú)占”或“重用”)綁定到空閑端口將成功
如果端口已經(jīng)“重用綁定”,則嘗試“獨(dú)占綁定”將失敗
如果某些進(jìn)程保留“獨(dú)占綁定”,則嘗試“重用綁定”將失敗
添加回答
舉報