Широковещательная рассылка UDP-пакетов с использованием нескольких сетевых адаптеров

Я создаю встроенную систему для контроллера камеры в Linux (не в режиме реального времени). У меня проблема с тем, чтобы сеть делала то, что я хочу. Система имеет 3 сетевых карты, 1 порт 100base-T и 2 гигабитных порта. Я подключаю более медленный к камере (это все, что он поддерживает), а более быстрый - это соединение точка-точка с другими машинами. Что я пытаюсь сделать, так это получить изображение с камеры, немного обработать его, а затем передать его с помощью UDP на каждую из других сетевых адаптеров.

Вот моя конфигурация сети:

eth0: addr: 192.168.1.200 Bcast 192.168.1.255 Маска: 255.255.255.0 (это 100base-t)
eth1: addr: 192.168. 2.100 Bcast 192.168.2.255 Маска: 255.255.255.0
eth2: addr: 192.168.3.100 Bcast 192.168.3.255 Маска: 255.255.255.0

Изображение поступает с eth0 по проприетарному протоколу, поэтому это сырой сокет. Я могу транслировать его на eth1 или eth2 нормально. Но когда я пытаюсь передать его обоим, один за другим, я получаю много сетевых сбоев и ошибок на eth0.

Я инициализирую сокеты UDP следующим образом:

sock2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // Or sock3
sa.sin_family=AF_INET;
sa.sin_port=htons(8000);
inet_aton("192.168.2.255",&sa.sin_addr); // Or 192.168.3.255
setsockopt(sock2, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
bind(sock2,(sockaddr*)&sa,sizeof(sa));

sendto(sock2,&data,sizeof(data),0,(sockaddr*)&sa,sizeof(sa)); // sizeof(data)<1100 bytes

Я делаю это для каждого сокета отдельно и вызываю sendto отдельно. Когда я делаю то или другое, все в порядке. Когда я пытаюсь отправить оба, eth0 начинает получать плохие пакеты.

Есть идеи, почему это происходит? Это ошибка конфигурации, есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ: Спасибо за помощь, я пробовал кое-что и изучаю подробнее. Строго говоря, выпуск не похоже на трансляцию. Я заменил широковещательный код одноадресной командой, и он ведет себя так же. Думаю, я лучше понимаю поведение, но не то, как его исправить.

Вот что происходит. На eth0 я должен получать изображение каждые 50 мс. Когда я отправляю изображение на eth1 (или 2), отправка изображения занимает около 1,5 мс. Когда я пытаюсь отправить и на eth1, и на eth2 одновременно, это занимает около 45 мс, иногда переходя до 90 мс. Когда это выходит за пределы окна 50 мс, буфер eth0 начинает наращиваться. Конечно, я теряю пакеты при заполнении буфера.

Итак, мой уточненный вопрос. Почему он может увеличиться с 1,5 мс до 45 мс, просто перейдя с одного порта Ethernet на два?

Вот мой код инициализации:

sock[i]=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
sa[i].sin_family=AF_INET;
sa[i].sin_port=htons(8000);
inet_aton(ip,&sa[i].sin_addr);

//If Broadcasting
char buffer[]="eth1" // or eth2
setsockopt(sock[i],SOL_SOCKET,SO_BINDTODEVICE,buffer,5);
int b=1;
setsockopt(sock[i],SOL_SOCKET,SO_BROADCAST,&b,sizeof(b));

Вот мой код отправки:

for(i=0;i<65;i++) {
  sendto(sock[0],&data[i],sizeof(data),0,sa[0],sizeof(sa[0]));
  sendto(sock[1],&data[i],sizeof(data),0,sa[1],sizeof(sa[1]));
}

Это довольно просто.

Есть идеи? Спасибо за вашу огромную помощь!

Пол

13
задан user1044200 14 November 2011 в 21:32
поделиться