多播IP地址 - 阻止呼叫给recvfrom(multicast ip address - bloc

2019-10-18 05:12发布

我写一个简单的多播应用。 我打算在本地主机上运行它。

我也做了以下情况:

char *maddr;
.
.
.
sendfd = socket(...);

struct sockaddr_in sasend;
sasend.sin_family = AF_INET;
sasend.sin_port = htonl(portno);
inet_ntop(maddr, &(sasend.sin_addr.s_addr));


struct sockaddr_in sarecv;
memcpy(&sarecv, &sasend);

recvfd = socket(...);

const int on = 1;
setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));  // can you explain why
                                                                // this  is needed

bind(recvfd, &sarecv);

struct ip_mreq mreq;
memcpy(&mreq.imr_multiaddr, &(sasend.sin_addr));
mreq.imr_interface = htonl(INADDR_ANY);

setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

char flag = 1;
setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &flag, 1);

if (fork() == 0) {
    while (recvfrom(recvfd)) {
    }
}
else {
  while (sendto(sendfd)) {
    sleep(3);
  }
}

在实际的代码我检查所有系统调用的返回值。 问题是,recvfrom的不返回。 流程撑挡在调用recvfrom的。

我已经尝试运行在不同的外壳程序的两个实例。 它并不能帮助。

还我试图回送标志设置为0,它并不能帮助。

我想同时运行从本地主机的程序。

我现在用的多播地址是239.255.1.2我从书中看到。 我认为,我们正在所需setsockopt调用我们可以使用任何d类地址。

连接端口1025

运行Linux内核2.6.25

还我如何检查是否组播的支持已经编译进内核。

更新

我做路由添加224.0.0.0 -net子网掩码240.0.0.0开发eth0的外壳上。 仍然存在问题。

Answer 1:

好吧,我禁用了防火墙,我可以得到程序的运行。 得到帮助从这里

现在更多的问题:

  • 如何将规则添加到防火墙上特别是我的代码运行
  • 如果我不禁止环回,然后我不从另一个进程发送同一多播组得到的消息,并且如果启用它然后我的过程接收其发送的消息。 这是因为我同时运行在本地主机上的程序。 是有没有解决办法。


文章来源: multicast ip address - blocked in call to recvfrom