Я пытаюсь реализовать какой-то механизм обнаружения для сетевого устройства.Цель моего приложения - обнаружить в сети устройство, независимое от сетевой конфигурации (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 с одним сетевым интерфейсом, и в то же время иметь возможность получать любые широковещательные рассылки по этому интерфейсу?