У меня есть сервер linux с двумя сетевыми картами (eth0 и eth1), и я установил eth0 по умолчанию в «ip route». Теперь я хотел бы получать многоадресные пакеты на eth1. Я добавил «224.0.20.0/24 dev eth1 proto static link scope» в таблицу маршрутизации и подключаюсь следующим образом:
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
// port 12345, adress INADDR_ANY
bind(sock, &bind_addr, sizeof(bind_addr));
// multicast address 224.0.20.100, interface address 10.13.0.7 (=eth1)
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq));
Согласно ip maddr
он подключается к этой группе на правом интерфейсе, а tshark -i eth1
показывает, что я на самом деле получаю многоадресные пакеты.
Однако я не получаю никаких пакетов при вызове recvfrom(sock)
. Если я установлю «ip route default» на eth1 (вместо eth0), я получу пакеты через recvfrom. Это проблема с моим кодом или настройкой сети, и как это правильно сделать?
(обновление) решение: caf намекнул, что this может быть той же проблемой; действительно: после выполнения echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
теперь я могу получать многоадресные пакеты!