реклама на сайте
подробности

 
 
> Теряются UDP пакеты
maxics
сообщение Apr 30 2013, 06:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 16-11-09
Пользователь №: 53 649



Gigabit Ethernet. Есть источник UDP пакетов (внешнее устройство) , подключенный напрямую к сетевой карте. Это устройство по запросу программы-клиента, выдает необходимое количество UDP пакетов. Программа-клиент реализована на C# и использует функцию из библиотеки System.Net - UdpClient (Socket). Проблема заключается в том, что при запросе больше 100 - 200 пакетов бывают потери пакетов (иногда приходят все пакеты). Сниффер все пакеты видит. Скорость 10 Мб/с. Если кто сталкивался, прошу помочь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
vetal
сообщение Apr 30 2013, 06:50
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Сталкивался. Напишите прокси на c/c++ и обеспечите достаточную буферизацию пакетов.
Прокси(перехватчик) должен обеспечивать прием пакетов и их ретрансляцию в Вашу программу на С# для дальнейшей неспешной обработки.
Производительность C# недостаточна для решения таких задач даже на i7 sad.gif

Так же для уменьшения потери пакетов желательно перейти на 100 МБит соединение(по крайней мере выйти на трафик не более 50% от возможностей интерфейса, т.к. при работе на 100% скорости нужен особый подход) и поиграться с настройками режимов работы трансиверов.
Go to the top of the page
 
+Quote Post
maxics
сообщение Apr 30 2013, 07:26
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 229
Регистрация: 16-11-09
Пользователь №: 53 649



Цитата(vetal @ Apr 30 2013, 09:50) *
Сталкивался. Напишите прокси на c/c++ и обеспечите достаточную буферизацию пакетов.
Прокси(перехватчик) должен обеспечивать прием пакетов и их ретрансляцию в Вашу программу на С# для дальнейшей неспешной обработки.
Производительность C# недостаточна для решения таких задач даже на i7 sad.gif

Так же для уменьшения потери пакетов желательно перейти на 100 МБит соединение(по крайней мере выйти на трафик не более 50% от возможностей интерфейса, т.к. при работе на 100% скорости нужен особый подход) и поиграться с настройками режимов работы трансиверов.


100 Мбит не подойдет, т.к. в дальнейшем скорость увеличится до 400 Мбит

Пробовал делать следующем образом на C++. При такой реализации не обеспечивается прием всех пакетов.

....инициализация сокета

//---------------------------------------------
// предача запроса на получение пакетов
wprintf(L"Sending a datagram to the receiver...\n");
iResult = sendto(SendSocket,
message, BufLen, 0, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
if (iResult == SOCKET_ERROR) {
wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
closesocket(SendSocket);
WSACleanup();
return 1;
}

//-----------------------------------------------
//ожидание приема пакетов и подсчет количества
wprintf(L"Receiving datagrams...\n");
int totalRecive=0;
while(true)
{
iResult = recvfrom(RecvSocket, RecvBuf, R_BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize);
totalRecive++;
if(totalRecive==TotalPack)
break;
}
//---------------------------------------------
// окончание приема.
wprintf(L"Finished sending. Closing socket.\n");

....закрытие сокета
Go to the top of the page
 
+Quote Post
vetal
сообщение Apr 30 2013, 18:24
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Для начала попробуйте отключить все лишнее - брэндмауэр, антивирус и все, что может вмешиваться в обмен(напр. маршрутизаторы).
Отключите все сервисы и программы, которые могут стучаться на данную карту.

Ваша программа должна устойчиво принимать все пакеты при отсутствии мешающих факторов. Поиграйтесь с настройками дуплекса, установите вашей программе приоритет реального времени.

Ну, и, учитывая особенность UDP - введите маркеры в пакетах и перезапрашивайте потерянные. 100% можно получить только в тепличных условиях.

Go to the top of the page
 
+Quote Post
rsv
сообщение Apr 30 2013, 18:38
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 119
Регистрация: 16-07-07
Из: Тула
Пользователь №: 29 160



А в каком режиме снифером смотрели? А то мы недавно столкнулись с ситуацией, что если wireshark в promicious mode, то и снифер все видит и клиентская прграмма работает. А если этот режим выключить-пакеты теряются. Происходит это из за того, что к позади пакета изредка добавляется случайный лишний байт, и этот пакет через аппаратный mac уровень не проходит. Вот сейчас ищем истоки этого лишнего байта
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016