c - 多播绑定(bind) - 地址已被使用

标签 c linux bind multicast

我尝试在我的应用程序中绑定(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/

相关文章:

clang/gcc 可以优化链表树吗?

使用计时器精确地每秒调用一个函数?

c++ - 静态链接库是否需要链接到它们的依赖项?

jquery - KineticJS:通过 .on() 监听

Linux:INET 监听套接字绑定(bind)的更细粒度控制?

c++ - 对已编译对象使用存档文件似乎会破坏编译

c - 程序在将 int 转换为 double 时终止。无法弄清楚为什么会出现段错误

python-3.x - 在Pyglet(Raspberry Pi 4B,Raspbian)中播放音频时听不到声音

linux - Golang webserver local.rc on raspbian 如何自动启动?

javascript - 对每个表行 react onclick