同一台机器上的多个多播通道 - 指定地址还是使用 INADDR_ANY?

用户997112

下面是在 Linux 上创建多播套接字的基本代码。

我有多个进程在一台机器上运行以下代码,每个进程都在侦听不同的多播频道。每个进程只处理相关数据。

代码中的两个阶段需要一个地址,或者INADDR_ANY.

鉴于我将运行多个单独的多播频道,我不确定何时应该使用INADDR_ANY或指定地址。我不希望进程接收到错误的多播数据。

// Create socket
int sock = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));

// Create multicast group
sockaddr_in mcast_group
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = INADDR_ANY;                         // INADDR_ANY or  specific address?

// Bind socket to multicast group
bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));

// Tell Kernel to join multicast group
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = inet_addr(interface.c_str());         // INADDR_ANY or specific address?

setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
灌木丛

如果每个socket正收听多播数据包,而不是单播,只为一个单一的多播地址,你可以直接绑定到多播地址:

sockaddr_in mcast_group;
memset(&mcast_group, 0, sizeof(mcast_group));
mcast_group.sin_family = AF_INET;
mcast_group.sin_port = htons(mcastPort);
mcast_group.sin_addr.s_addr = inet_addr(group.c_str());  // bind to multicast group

bind(sock, (struct sockaddr*)&mcast_group, sizeof(mcast_group));

请注意,您仍然必须加入多播组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

同时使用INADDR_ANY和特定IP绑定到同一端口

可以使用INADDR_ANY读取通过WinSock中的127.0.0.1发送的多播吗?

套接字-在客户端使用INADDR_ANY

使用INADDR_ANY的目的和结果是什么?

如何在一台机器上使用socat测试多播

无法使用在另一台机器上运行的代码接收多播数据

如何在同一台机器上使用 docker 为一个项目托管多个环境?

getaddrinfo和INADDR_ANY

如何配置Apache在同一台机器上与FE和BE一起使用?

同一台机器上的两个Tomcat实例使用相同的日志文件

在同一台机器上使用两个不同的php版本

在一台机器上使用 GitHub 和多个帐户

使用约束在一台机器上运行多个 traefik 实例

在一台机器上使用sixxs子网

在开发中与INADDR_ANY和INADDR_LOOPBACK绑定?

在一台机器上运行多个jmeter任务,如何指定一个端口来停止jmeter测试

何时以及为何使用AF_UNIX,为什么要在同一台机器上使用

在同一台机器上使用github和公司的gitlab时如何使用不同的用户?

使用Kubernetes进行部署-同一台机器上的主节点和节点的可行性

使用python在同一台机器上模拟可靠的发送者和接收者

一台Linux机器上的分段错误,但使用C ++代码不在另一台机器上

拒绝连接到同一台机器的本地 IP 地址 (192.68....)

如何在一台机器上使用相同的二进制文件运行多个进程

如何使用 Consul 一次在一台机器上执行同步任务?

多个人如何同时使用带键盘的一台机器并监视每个人?

可以在一台机器上使用GitHub和GitLab吗?

在另一台机器上使用gulp项目

如何在一台机器上使用GitLab和Gitlab-Mattermost?

我应该在Elasticsearch中在一台机器上使用分片/复制吗?