我尝试在我的应用程序中绑定(bind)一个多播端口。以前代码总是有效的,但在这个服务器上它(经常,但不总是)失败......
错误信息是Address already in use
,我不太明白,因为可以绑定(bind)来自多个应用程序(甚至来自同一应用程序)的相同地址...
什么会导致这种情况?我知道有人会要求它,所以这是代码:
int fd = socket(PF_INET, SOCK_DGRAM, 0);
/* yes, that's a valid socket, verified.... */
u_int val = 1;
if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) {
perror("Reusing ADDR failed");
exit(1);
}
struct sockaddr_in saddr;
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = inet_addr(multicast_group_ip);
saddr.sin_port = htons(port);
/* yes, valid multicast ip address and port, verified */
if(bind(fd, (struct sockaddr *) &saddr, sizeof(struct sockaddr_in)) == -1)
//FAILS....
最佳答案
您实际上可以将多个数据报套接字绑定(bind)到同一个多播组和端口。但是,所有这些套接字都应设置 SO_REUSEADDR 选项。根据您的代码,您似乎正在这样做,但听起来您的服务器上有另一个进程已将套接字绑定(bind)到相同的多播组和端口,而没有设置该选项。解决方案是确保此特定服务器上将套接字绑定(bind)到该多播组和端口的所有进程都设置了 SO_REUSEADDR 选项。
编辑:
为了回应您最近的上述评论,您可以实际重现此问题的一种方法是创建两个简单的多播监听程序,它们都将数据报套接字绑定(bind)到相同的端口和组。让其中一个程序设置 SO_REUSEADDR 选项,但不设置另一个。运行未设置 SO_REUSEADDR 的程序,您应该会看到多播数据通过。在保留此程序的同时,运行确实设置了 SO_REUSEADDR 的第二个程序,您应该会看到它不会接收任何多播数据,而第一个程序仍在接收它(这应该会复制您最初描述的问题)。
最后,关闭两个程序,然后修改第一个程序设置SO_REUSEADDR,重复上述步骤。您现在应该看到两个程序都接收到多播流量。
关于c - 多播绑定(bind) - 地址已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734338/