3 回答
TA贡献1735条经验 获得超5个赞
在接收多播时绑定UDP套接字意味着指定从中接收数据的地址和端口(不是本地接口,TCP接受器绑定就是这种情况)。在这种情况下,指定的地址具有过滤作用,即,套接字将仅接收发送到该多播地址和端口的数据报,而不管套接字随后加入了什么组。这就解释了为什么绑定到INADDR_ANY(0.0.0.0)时,我会收到发送到多播组的数据报,而绑定到任何本地接口时,我却什么都没收到,即使数据报是在与该接口相连的网络上发送的也是如此对应。
引自UNIX Stevens的网络编程第1卷,第三版:套接字网络API。21.10。发送和接收
[...]我们希望接收套接字绑定多播组和端口,例如239.255.1.2端口8888。(回想一下,我们可以只绑定通配符IP地址和端口8888,但是绑定多播地址会阻止套接字接收可能到达端口8888的任何其他数据报。)然后,我们希望接收套接字加入多播组。发送套接字将数据报发送到该相同的多播地址和端口,例如239.255.1.2端口8888。
TA贡献1790条经验 获得超9个赞
绑定多播(udp)套接字是什么意思的更正?只要在以下引用中部分正确:
“绑定”操作的基本意思是,“使用此本地UDP端口发送和接收数据。换句话说,它将分配该UDP端口供您的应用程序专用。
有一个例外。如果应用了该选项,则多个应用程序可以共享同一端口进行侦听(通常对于多播数据报具有实用价值)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);
如果多个进程进行了这种“重用绑定”,则在该共享端口上接收到的每个UDP数据报都将传递到每个进程(提供与多播流量的自然联合)。
以下是有关在某些情况下会发生什么的更多详细信息:
尝试将任何绑定(“独占”或“重用”)绑定到空闲端口将成功
如果端口已经“重用绑定”,则尝试“独占绑定”将失败
如果某些进程保留“独占绑定”,则尝试“重用绑定”将失败
添加回答
举报