2014-08-27 3 views
0

Я пишу программу для 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) { 
     ... 
    } 
... 
} 
+1

Если eth0 и eth1 находятся в одной и той же подсети, что не означает, что вы получите каждый пакет вещания дважды? Может быть, это причина, по которой она отфильтрована и доставлена ​​только одному адаптеру? – ypnos

+0

Вот небольшой трюк. Адреса сетевых адаптеров принадлежат к одной и той же подсети, но они физически связаны с разными сетями, у которых разные пакеты. –

+0

Вы пытались настроить eth0 для другой подсети? Вы пытались, если eth1 работает, когда eth0 не работает? – ypnos

ответ

1

Если я вас правильно понимаю, у вас есть две сетевые карты, подключенные к двум физическим сетям (т.е. сетевые кабели, концентраторы), с каждый из которых имеет отдельный IP-адрес от тот же диапазон адресов подсети?

Короткий ответ: неправильная конфигурация сети. Если они действительно являются отдельными физическими сетями, то они должны иметь разные адреса подсети. Это зависит от того, что вы имеете в виду с отдельными физическими сетями, отдельным оборудованием? У вас нет двух отдельных подсетей с одним и тем же адресом подсети. Вот почему я говорю, что ваша сетевая конфигурация неверна.

Однако впечатление, которое я получаю, заключается в том, что вы пытаетесь объединить две сети, чтобы два сетевых адаптера принадлежали к одной и той же подсети (а не отдельной). Ну, тогда вы должны их свести. Вы соединяете два сетевых адаптера вместе и назначаете один IP-адрес мосту. Затем вы сможете получать свои пакеты на обеих сетевых адаптерах.

В Linux:

brctl addbr br0 
ifconfig eth0 0.0.0.0 down 
ifconfig eth1 0.0.0.0 down 
brctl addif br0 eth0 
brctl addif br0 eth1 
ifconfig eth0 up 
ifconfig eth1 up 
ifconfig br0 up 
ifconfig br0 192.168.225.107 (or 192.168.225.108, whatever you prefer) 
+0

Спасибо, это отличная идея. Он работает на тестовом компьютере, но, к сожалению, я не могу изменить конфигурацию сети на целевой платформе. –

Смежные вопросы