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