Есть GigE Vision камера подключенная прямым кабелем к компьютеру.
IP камеры: 10.0.0.234/24
IP компьютера: 192.168.42.1/24
Стандартный код передачи broadcast пакета (полный код пока писать не буду, только ключевые моменты псевдокодом:
int s = socket(AF_INET, SOCK_DGRAM, 0);
bind(s, {adapter->IP});
setsockopt(s, SOL_SOCKET, SO_BROADCAST, true);
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, {1sec});
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, {1sec});
sendto(s, GVCPCmdDeviceDiscovery, {INADDR_BROADCAST});
sleep();
recvfrom(s);
В WireShark я вижу что команда уходит и ответ возвращается:
15 59.752591431 192.168.42.1 255.255.255.255 GVCP 50 > DISCOVERY_CMD
16 59.752820098 10.0.0.234 255.255.255.255 GVCP 298 < DISCOVERY_ACK
Программа ответа не видит.
Если перевести компьютер в одну подсеть с камерой то все, конечно, работает. Но это не всегда возможно (особенно с точки зрения потребителя).
Под Windows (говорят... не проверил пока еще) все работает (сейчас займусь проверкой, добавлю информацию).
На тот же компьютер было установлено ПО от компании Pleora.
При установки Pleora был сказана интересная фраза про net.ipv4.conf.all.rp_filter. Были опробованы все три значения (0, 1, 2). В режимах 0 и 2 Pleora камеру видит, в режиме 1 - не видит. (как и сказано в коментарии к установке).
При этом указанный выше код не работает совсем. Разницы в пакетах по wireshark не увидел.
Собственно вопрос: Что из опций упущено в тестовом коде? Как получить Broadcast пакет из чужой подсети?