Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Теряются UDP пакеты
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
maxics
Gigabit Ethernet. Есть источник UDP пакетов (внешнее устройство) , подключенный напрямую к сетевой карте. Это устройство по запросу программы-клиента, выдает необходимое количество UDP пакетов. Программа-клиент реализована на C# и использует функцию из библиотеки System.Net - UdpClient (Socket). Проблема заключается в том, что при запросе больше 100 - 200 пакетов бывают потери пакетов (иногда приходят все пакеты). Сниффер все пакеты видит. Скорость 10 Мб/с. Если кто сталкивался, прошу помочь.
vetal
Сталкивался. Напишите прокси на c/c++ и обеспечите достаточную буферизацию пакетов.
Прокси(перехватчик) должен обеспечивать прием пакетов и их ретрансляцию в Вашу программу на С# для дальнейшей неспешной обработки.
Производительность C# недостаточна для решения таких задач даже на i7 sad.gif

Так же для уменьшения потери пакетов желательно перейти на 100 МБит соединение(по крайней мере выйти на трафик не более 50% от возможностей интерфейса, т.к. при работе на 100% скорости нужен особый подход) и поиграться с настройками режимов работы трансиверов.
maxics
Цитата(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");

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

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

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

rsv
А в каком режиме снифером смотрели? А то мы недавно столкнулись с ситуацией, что если wireshark в promicious mode, то и снифер все видит и клиентская прграмма работает. А если этот режим выключить-пакеты теряются. Происходит это из за того, что к позади пакета изредка добавляется случайный лишний байт, и этот пакет через аппаратный mac уровень не проходит. Вот сейчас ищем истоки этого лишнего байта
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.