Я создаю встроенную систему для контроллера камеры в 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]));
}
Это довольно просто.
Есть идеи? Спасибо за вашу огромную помощь!
Пол