2014-06-26 3 views
3

Мне нужно отправить многоадресные данные из интерфейса eth0 и получить его на eth1 на машине Linux. У меня есть 2 программы в C, PROG-1 делает setsockopt IP_MULTICAST_IF так, что он отправил бы от eth0, PROG-2 действительно присоединится к группе mcast на eth1 (проверен с netstat -ng), но не может видеть многоадресный трафик на eth1. Я могу видеть только многоадресные данные на eth0. Я увеличил TTL, но не помог. Есть ли способ получить многоадресную рассылку, отправленную с eth0 на eth1?
IP_MULTICAST_LOOP тоже не помогает, он работает только тогда, когда обе программы работают на одном интерфейсе, и это не хорошо для меня.
Это настраиваемый протокол по ipv4.Отправить multicast от eth0 до eth1

код Отправитель Код

sock_fd = socket(AF_INET, SOCK_RAW, 100); 
srcip = inet_addr("10.1.231.112"); /* src mcast from eth0 */ 
ret_val = setsockopt(sock_fd, 
         IPPROTO_IP, 
         IP_MULTICAST_IF, 
         &srcip, 
         sizeof(srcip));  
ttl = 0x2; 
ret_val = setsockopt(sock_fd, 
         IPPROTO_IP, 
         IP_MULTICAST_TTL, 
         (char *) &ttl, 
         sizeof(ttl)); 

dest_addr.sin_addr.s_addr = inet_addr("224.100.1.102"); 
dest_addr.sin_family = AF_INET; 
dest_addr.sin_port = 0; 

ret_val = sendto(sock_fd, (char *) buf, 
      (size_t) 64, 0, /* no flags */ 
      (struct sockaddr *) &dest_addr, addr_len); 

Приемник:

sock_fd = socket(AF_INET, SOCK_RAW, 100); 
mreq.imr_multiaddr.s_addr = inet_addr("224.100.1.102"); 
mreq.imr_interface.s_addr = inet_addr("10.0.3.15"); /* join on eth1 */ 
ret_val = setsockopt(sock_fd, 
         IPPROTO_IP, 
         IP_ADD_MEMBERSHIP, 
         (char *) &mreq, 
         sizeof(mreq)); 
msglen = recvfrom(sock_fd, buf, 4096, 0, 
     (struct sockaddr*)&addr_struct, &addr_len); 

Я проверил с NetStat -ng, что приемник присоединился к группе на eth1, но сообщение, посланное отправителем является видимым только на eth0 (wirehark on eth1 ничего не захватывает).

Позвольте мне объяснить точную проблему, с которой я столкнулся. У меня есть производственный код, который обычно работает на проприетарном оборудовании. Это часть программного обеспечения для сетевого общения. Вся связь осуществляется через многоадресную рассылку. Архитектура состоит в том, что есть задача TX, которая отправляет многоадресные данные другим устройствам в сети, к сожалению, есть также задача RX, которая объединяет ту же группу, что и задача TX, отправляет данные, поскольку другие сетевые устройства взаимодействуют с моим устройством на одном и том же адресе mcast. В производственном коде у нас отключен многоадресный цикл, и все в порядке, задача RX не получает отправку задачи TX. Теперь мы решили запустить это программное обеспечение на Linux-машине для тестирования, на той же машине мы хотим запустить программное обеспечение, которое имитирует все остальные поля. То, что я хотел выполнить, чтобы «привязать» все сокеты mcast к производственному коду к eth0 и симулятору eth1. Но я не могу заставить их общаться друг с другом. Я могу настроить свои сетевые интерфейсы по мере необходимости, добавить vlans, интерфейсы или что-нибудь еще, просто чтобы они обменивались данными друг с другом. То, что я не могу сделать, это изменить архитектуру этого программного обеспечения.

+0

какой протокол используется здесь (ipv4 или v6)? какой многоадресный адрес указан? почему бы вам не опубликовать свой код? – macfij

+0

Являются ли ваши 2 сетевых адаптера в разных подсетях IP или VLAN? Если так, вашему маршрутизатору, как правило, требуется несколько специальных регуляторов конфигурации для передачи трафика между ними. – nos

+0

Как использовать рефлектор, вспомогательный процесс, который действует как мост между двумя адресами многоадресной передачи? Ваш рефлектор, возможно, должен отслеживать сообщения, которые он уже отправил (чтобы каждое сообщение пересекало «мост» отражателя только один раз), но кроме этого, это должна быть довольно простая программа, особенно если у вас есть что-то в самих сообщениях , в протоколе, который однозначно идентифицирует сообщения. –

ответ

0

Посмотрите на igmpproxy http://sourceforge.net/projects/igmpproxy/ Он принимает многоадресные пакеты на одном интерфейсе и затем передает его указанным другим.

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