Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多播绑定-地址已在使用中_C_Linux_Bind_Multicast - Fatal编程技术网

C 多播绑定-地址已在使用中

C 多播绑定-地址已在使用中,c,linux,bind,multicast,C,Linux,Bind,Multicast,我尝试在我的应用程序中绑定一个多播端口。以前代码总是有效的,但是在这个服务器上它(经常,但不总是)失败 错误消息是地址已在使用中,我不太理解,因为可以从多个应用程序(甚至从同一应用程序)绑定同一地址 这是什么原因造成的?我知道有人会要求它,所以下面是代码: int fd = socket(PF_INET, SOCK_DGRAM, 0); /* yes, that's a valid socket, verified.... */ u_int val = 1; if(setsockopt(fd,

我尝试在我的应用程序中绑定一个多播端口。以前代码总是有效的,但是在这个服务器上它(经常,但不总是)失败

错误消息是
地址已在使用中
,我不太理解,因为可以从多个应用程序(甚至从同一应用程序)绑定同一地址

这是什么原因造成的?我知道有人会要求它,所以下面是代码:

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....
intfd=socket(PF_INET,SOCK_DGRAM,0);
/*是的,这是一个有效的套接字,已验证*/
u_int val=1;
if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val))<0){
perror(“重用地址失败”);
出口(1);
}
saddr中的结构sockaddr_;
saddr.sin_family=PF_INET;
saddr.sin\u addr.s\u addr=inet\u addr(多播组ip);
saddr.sin_端口=htons(端口);
/*是,有效的多播ip地址和端口,已验证*/
if(bind(fd,(struct sockaddr*)和saddr,sizeof(struct sockaddr_in))=-1)
//失败。。。。

同一
主机:端口上可能有多个打开的套接字。从一个进程中,不可能有多个进程侦听(即绑定)到同一
主机:端口

也许,您已经取消了服务器进程的前一个实例


Wug提到的另一个选项是,您试图绑定到低于1024的端口,而不是根端口。低端口1-1024的范围为有效UID==0的应用程序保留,例如,由root启动。这似乎是错误的假设,因为在这种情况下,您会得到不同的错误,而不是已经在使用的

您实际上可以将多个数据报套接字绑定到同一个多播组和端口。但是,所有这些套接字都应该设置SO_REUSEADDR选项。根据您的代码,您似乎正在这样做,但听起来您的服务器上有另一个进程将套接字绑定到同一个多播组和端口,而没有设置该选项。解决方案是确保将套接字绑定到该多播组和端口的特定服务器上的所有进程都设置了SO_REUSEADDR选项

编辑:
为了回应您最近的评论,您可以实际复制这一点的一种方法是创建两个简单的多播侦听程序,它们都将数据报套接字绑定到相同的端口和组。让其中一个程序设置SO_REUSEADDR选项,但不要设置另一个。运行未设置SO_REUSEADDR的程序,您应该会看到多播数据通过。在不运行此程序的情况下,运行第二个设置了SO_REUSEADDR的程序,您应该看到,当第一个程序仍在接收多播数据时,它将不会接收任何多播数据(这将复制您最初描述的问题)


最后,关闭两个程序,然后将第一个程序修改为设置SO_REUSEADDR,并重复上述步骤。您现在应该可以看到两个程序都接收到多播通信。

“不可能有超过个进程监听(即绑定)到同一个主机:端口”-不正确,测试过。这是udp multicast.hmm,刚刚在Linux上检查过,是的,这是可能的。胡乱猜测:是否有其他侦听器已绑定到此套接字,并且它不允许其他应用程序重用该套接字?我的意思是,如果其他进程没有行
setsockopt(fd,SOL_socket,SO_REUSEADDR,&val,sizeof(val))
如果在您的mcast侦听器之前运行,您将收到此错误。否,这将为该应用程序提供重用权限,并且对于不同的进程来说应该无关紧要。如果您共享端口和地址,则SD需要
SO\u REUSEPORT
而不是
SO\u REUSEADDR
saddr.sin\u family=PF\u INET应该是
AF\u INET
,不是吗?你的系统是什么?发行版/内核版本?@MichaelFoukarakis:Linux,各种。。。也许是CentOS?注意:这是4年前的事了,我已经不在那种环境中了。不要让我复制这些。嗯,那太糟糕了,因为我也不能复制。