将UDP广播绑定到单个接口

时间:2019-01-24 14:51:29

标签: c++ c linux sockets

我正在尝试为网络设备实现某种发现机制。 我的应用程序的目标是独立于网络配置(IPv4)发现网络上的设备。

我的设备正在等待固定端口上具有固定内容的UDP广播(255.255.255.255)。如果内容匹配,则设备将发送广播(再次为255.255.255.255),该广播应由PC接收。

现在我的问题在PC端: PC应该在特定的网络接口上发送广播。为此,我将套接字绑定到网络地址。在Windows上,此解决方案将完美运行。但是在Linux上似乎更加困难。将套接字绑定到网络地址时,无法接收任何广播。

int ret;
this->port = port;

socketfd = socket(AF_INET, SOCK_DGRAM, 0);
if (socketfd < 0) {
    this->port = 0;
    return;
}

struct sockaddr_in bindAddr;
memset(&bindAddr, 0, sizeof(bindAddr));
bindAddr.sin_family = AF_INET;
bindAddr.sin_addr.s_addr = inet_addr("192.168.2.104");//ipV4;
bindAddr.sin_port = htons(port);
ret = bind(socketfd, (struct sockaddr *)&bindAddr, sizeof(bindAddr));

if (ret < 0) {
    int error = errno;
    this->port = 0;
    return;
}

int broadcastOpt = 1;
ret = setsockopt(socketfd, SOL_SOCKET, SO_BROADCAST, &broadcastOpt, sizeof(broadcastOpt));

if (ret < 0) {
    //int error = errno;
    this->port = 0;
    return;
}

我还找到了sockopt SO_BINDTODEVICE,当我以root用户身份执行应用程序时可以使用。但是最后这不是我的应用程序的解决方案。 有谁知道如何将UDP广播绑定到单个网络接口,同时还能够在该接口上接收任何广播吗?

0 个答案:

没有答案