首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绑定组播(UDP)套接字意味着什么?

绑定组播(UDP)套接字意味着什么?
EN

Stack Overflow用户
提问于 2012-05-22 05:33:52
回答 4查看 118.4K关注 0票数 79

我在具有多个网络接口的主机之间使用多播UDP。我使用的是boost::asio,我被接收器必须进行的两个操作搞糊涂了:绑定,然后是join-group。

当您对加入的每个组播组执行此操作时,为什么需要在绑定过程中指定接口的本地地址?

姐妹问题涉及多播端口:由于在发送期间,您发送到多播地址和端口,为什么在订阅多播组期间,您只指定地址,而不指定端口-在令人困惑的绑定调用中指定的端口。

注意:"join-group“是setsockopt(IP_ADD_MEMBERSHIP)上的一个包装器,正如文档所述,它可以在同一套接字上被多次调用,以订阅不同的组(通过不同的网络?)。因此,在我每次订阅一个组时,丢弃bind调用并指定端口是非常有意义的。

在我看来,总是绑定到"0.0.0.0“,并在加入组时指定接口地址,效果非常好。迷惑了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-24 22:25:25

在接收多播时绑定UDP套接字意味着指定接收数据的地址和端口(而不是像TCP接受器绑定那样的本地接口)。在这种情况下指定的地址具有过滤角色,即套接字将只接收发送到该组播地址和端口的数据报,而不管套接字随后加入了什么组。这就解释了为什么当绑定到INADDR_ANY (0.0.0.0)时,我会收到发送到我的组播组的数据报,而当绑定到任何本地接口时,即使数据报是在该接口所对应的网络上发送的,我也没有收到任何数据报。

引用自W.R·史蒂文斯所著的UNIX®Network Programming第1卷第三版: The Sockets Networking API。21.10。发送和接收

...我们希望接收套接字绑定多播组和端口,比如239.255.1.2端口8888。(回想一下,我们可以只绑定通配符IP地址和端口8888,但是绑定多播地址会阻止套接字接收可能发往端口8888的任何其他数据报。)然后,我们希望接收套接字加入组播组。发送套接字将发送数据报到相同的多播地址和端口,例如239.255.1.2端口8888。

票数 67
EN

Stack Overflow用户

发布于 2012-05-22 12:00:11

“绑定”操作基本上是说,“使用这个本地UDP端口发送和接收数据。换句话说,它为您的应用程序分配独占使用的UDP端口。( TCP套接字也是如此)。

当您绑定到"0.0.0.0“(INADDR_ANY)时,您基本上是在告诉TCP/IP层使用所有可用适配器进行侦听,并选择最佳的适配器进行发送。这是大多数套接字代码的标准实践。只有当您想要在特定的网络适配器上发送/接收时,才不会为IP地址指定0。

同样,如果在绑定期间指定端口值0,操作系统将为该套接字分配一个随机可用的端口号。因此,我期望对于UDP多播,您将绑定到预期将多播流量发送到的特定端口号上的INADDR_ANY。

“加入组播组”操作(IP_ADD_MEMBERSHIP)是必需的,因为它基本上告诉你的网络适配器不仅要监听目标MAC地址是你自己的以太网帧,它还告诉以太网适配器(NIC)监听IP组播流量以及相应的组播以太网地址。每个多播IP映射到多播以太网地址。当您使用套接字发送到特定的组播IP时,以太网帧上的目标MAC地址将设置为组播IP的相应组播MAC地址。当您加入组播组时,您正在配置NIC以侦听发送到同一MAC地址(除了它自己的地址之外)的流量。

如果没有硬件支持,多播不会比普通广播IP消息更有效。加入操作还会告诉您的路由器/网关转发来自其他网络的组播流量。(有人记得MBONE吗?)

如果加入组播组,NIC将接收该IP地址上所有端口的所有组播流量。只有指向您绑定的侦听端口的流量才会沿TCP/IP堆栈向上传递到您的应用程序。至于为什么在多播订阅期间指定端口-这是因为多播IP只是- IP。“端口”是上层协议(UDP和TCP)的属性。

您可以阅读有关多播IP地址如何映射到各个站点的多播以太网地址的更多信息。The Wikipedia article是它能得到的最好的东西:

IANA拥有OUI MAC地址01:00:5e,因此使用以太网MAC地址范围01:00:5e:00:00:00 - 01:00:5e:7f:ff:ff发送组播数据包。这是23位的可用地址空间。第一个八位字节(01)包括广播/多播位。28位多播IP地址的低23位被映射到可用的以太网地址空间的23位。

票数 56
EN

Stack Overflow用户

发布于 2013-01-31 04:57:11

更正What does it mean to bind a multicast (udp) socket?,只要它在以下引号中部分正确:

“绑定”操作基本上是说,“使用这个本地UDP端口发送和接收数据。换句话说,它将UDP端口分配给专用,供您的应用程序使用

有一个例外。如果应用了SO_REUSEADDR选项,则多个应用可以共享用于侦听的同一端口(通常对于多播数据报具有实用价值)。例如

代码语言:javascript
运行
复制
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数据报都将被传送到每个进程(为自然连接提供多播流量)。

以下是有关在几种情况下发生的情况的进一步详细信息:

如果端口已经被独占绑定到“"reuse-binded"

  • attempt

  • ”,则任何绑定(“独占”或“重用”)释放端口的尝试将被独占绑定到“独占绑定”将失败如果某个进程保持“

,则将失败

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10692956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档