组播IP地址 - 在调用recvfrom时被阻止

时间:2009-11-08 19:01:07

标签: linux networking network-programming ip-address multicast

我正在编写一个简单的多播应用程序。我打算在localhost上运行它。

我做了以下事情:

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时,该过程一直处于阻塞状态。

我尝试在不同的shell上运行该程序的两个实例。它无济于事。

我也尝试将loopback标志设置为0,但它没有帮助。

我想从localhost运行这两个程序。

我使用的多播地址是239.255.1.2 我从书中看到过。我认为我们可以使用任何D类地址,因为我们正在进行必要的setsockopt调用。

在端口1025上连接

运行linux内核2.6.25

我如何检查多播支持是否已编译到内核中。

更新

我确实在shell上添加了-net 224.0.0.0 netmask 240.0.0.0 dev eth0。 仍然存在问题。

1 个答案:

答案 0 :(得分:1)

好吧我禁用了防火墙,我可以让程序运行。 得到了here

的帮助

现在出现更多问题:

  • 如何将规则添加到防火墙以专门运行我的代码
  • 如果我不禁用环回,那么我不会从另一个进程发送在同一个多播组上的消息,如果我启用它,那么我的进程会收到它传输的消息。这是因为我在localhost上运行这两个程序。有办法吗?