我尝试在我的应用程序中绑定多播端口。以前代码总是可以工作,但是在这个服务器上它(经常,但不总是)失败…
错误消息是Address already in use,我不太明白,因为可以从多个应用程序(甚至从同一个应用程序)绑定同一地址。
是什么原因造成的?我知道有人会要求的,所以这里是代码:

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....

最佳答案

实际上,可以将多个数据报套接字绑定到同一个多播组和端口。但是,所有这些套接字都应该设置so_reuseaddr选项。根据您的代码,您似乎正在执行此操作,但听起来您的服务器上有另一个进程将套接字绑定到同一个多播组和端口,而没有设置该选项。解决方案是确保此特定服务器上绑定套接字到该多播组和端口的所有进程都设置了so_reuseaddr选项。
编辑:
为了响应您最近的评论,一种方法是创建两个简单的多播侦听程序,这两个程序都将一个数据报套接字绑定到同一个端口和组。让其中一个程序设置sou reuseaddr选项,而不是另一个。运行没有sou reuseaddr集的程序,您应该可以看到多播数据通过。在保留此程序的同时,运行第二个设置了sou reuseaddr的程序,您应该看到它在第一个程序仍在接收数据时不会接收任何多播数据(这应该会复制您最初描述的问题)。
最后,关闭两个程序,然后修改第一个程序以设置so_reuseaddr,并重复上述步骤。现在您应该看到两个程序都接收到多播通信量。

10-01 05:41
查看更多