Привязать широковещательную рассылку UDP к одному интерфейсу - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь реализовать какой-то механизм обнаружения для сетевого устройства.Цель моего приложения - обнаружить в сети устройство, независимое от сетевой конфигурации (IPv4).

Мое устройство ожидает широковещательную передачу UDP (255.255.255.255) по фиксированному порту и с фиксированным содержимым.Если содержимое совпадает, устройство отправляет широковещательную рассылку (снова на 255.255.255.255), которая должна быть получена ПК.

Теперь моя проблема на стороне ПК: ПК должен отправить широковещательную рассылку по определенномусетевой интерфейс.Для этого я привязываю сокет к сетевому адресу.На 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 с одним сетевым интерфейсом, и в то же время иметь возможность получать любые широковещательные рассылки по этому интерфейсу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...