linux - 多播 ip 地址 - 在调用 recvfrom 时被阻止

标签 linux networking network-programming ip-address multicast

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

我做了以下事情:

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 上运行该程序的两个实例。它没有帮助。

我也试过将环回标志设置为 0,但没有帮助。

我想从本地主机运行这两个程序。

我使用的多播地址是 239.255.1.2 我从书中看到的。我认为我们可以在进行所需的 setsockopt 调用时使用任何 D 类地址。

在端口 1025 上连接

运行 linux 内核 2.6.25

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

更新:

我在 shell 上执行了 route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0。 问题依然存在。

最佳答案

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

现在更多问题:

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

关于linux - 多播 ip 地址 - 在调用 recvfrom 时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697534/

相关文章:

linux - 将 ncurses 与 initrd 结合使用(linux mint 13 - 默认内核)

java - 我如何识别网络应用程序的多个命令(Java)

JAVA:服务器客户端程序在读取文本文件时出现 NumberFormatException

c++ - 如何在 C++ 中使用套接字?

network-programming - asn1 符号和库如何帮助我?

powershell - Powershell脚本从远程主机获取NIC速度

c++ - 如何获取X-window中每个角落的Windowed Window的屏幕坐标?

c++ - mmap共享缓冲区读取问题

C - 命令历史(核心转储)

Linux 上的 Java : Listening to broadcast messages on a bound local address