Я пишу программу для Linux, которая должна получать широковещательные пакеты UDP из указанного порта на любом из сетевых интерфейсов, существующих в системе.UDP Broadcast receive - привязка к нескольким NIC
Однако, если система имеет несколько сетевых интерфейсов одного и того же адреса подсети, пакеты принимаются только первым интерфейсом.
Например, если eth0 имеет 192.168.225.107, а eth1 - 192.168.225.108, пакеты принимаются только от eth0.
Сетевые адаптеры подключаются к различным физическим сетям. Согласно tcpdump, пакеты присутствуют в обеих сетях.
кода (проверка ошибок пропущена):
sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &on, sizeof(on));
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &s, sizeof(s));
bzero(&serv_addr_ip, sizeof(serv_addr_ip));
serv_addr_ip.sin_family = AF_INET;
serv_addr_ip.sin_port = htons(port);
serv_addr_ip.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr = (struct sockaddr *) &serv_addr_ip;
addr_len = sizeof(struct sockaddr_in);
bind(sock, serv_addr, addr_len);
while (1) {
if ((chars = recvfrom(sock, var.buf, MSG_MAX, 0, serv_addr, &addr_len)) < 0) {
...
}
...
}
Если eth0 и eth1 находятся в одной и той же подсети, что не означает, что вы получите каждый пакет вещания дважды? Может быть, это причина, по которой она отфильтрована и доставлена только одному адаптеру? – ypnos
Вот небольшой трюк. Адреса сетевых адаптеров принадлежат к одной и той же подсети, но они физически связаны с разными сетями, у которых разные пакеты. –
Вы пытались настроить eth0 для другой подсети? Вы пытались, если eth1 работает, когда eth0 не работает? – ypnos