我正在编写一个简单的多播应用程序。我打算在本地主机上运行它。
我做了以下事情:
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 。问题仍然存在。