为了账号安全,请及时绑定邮箱和手机立即绑定

绑定多播(UDP)套接字是什么意思?

绑定多播(UDP)套接字是什么意思?

我在具有多个网络接口的主机之间使用多播UDP。我正在使用boost :: asio,并被接收者必须进行的2个操作混淆:绑定,然后加入组。当您对加入的每个多播组进行设置时,为什么在绑定期间需要指定接口的本地地址?姐妹问题涉及多播端口:由于在发送过程中,您发送到多播地址和端口,为什么在订阅多播组期间仅指定地址,而不指定端口-在对的混乱调用中指定的端口绑定。注意:“ join-group”是over的包装setsockopt(IP_ADD_MEMBERSHIP),如所记录的那样,可以在同一套接字上多次调用该包装以订阅不同的组(通过不同的网络?)。因此,每次我订阅一个组时,放弃绑定调用并指定端口是很有意义的。从我看来,始终绑定到“ 0.0.0.0”并在加入组时指定接口地址,效果很好。困惑。
查看完整描述

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。


查看完整回答
反对 回复 2019-12-17
?
富国沪深

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数据报都将传递到每个进程(提供与多播流量的自然联合)。


以下是有关在某些情况下会发生什么的更多详细信息:


尝试将任何绑定(“独占”或“重用”)绑定到空闲端口将成功


如果端口已经“重用绑定”,则尝试“独占绑定”将失败


如果某些进程保留“独占绑定”,则尝试“重用绑定”将失败


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 1136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信