Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с Ethernet
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Hatory
Всем добрый вечер.

Помогите разобраться со странной проблемой:
На отладочной плате Stratix II GX PCIe собрали систему с модулем triple speed ethernet, для программной части
для Nios был взят драйвер vadimuzzz'а + дописана реализация протокола UDP. Ping успешно проходит. Пакеты
UDP от ПК в ПЛИС приходят, ответные пакеты видны в Wireshark, но приложение на ПК их не получает. При
просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"




всем откликнувшимся заранее большое спасибо!
Konst_777
Цитата(Hatory @ Jan 20 2014, 20:59) *
...При просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"...

А где в Wireshark-е это видно? Может, просто нужно утихомирить firewall?
Выложите в эту тему в архиве лог Wireshark-а ("Test.pcapng") при обмене несколькими UDP-пакетами.
Hatory
Спасибо за участие.

"Ошибки при передаче" отображаются не в Wireshark'е, а при использовании команды netstat. Брандмауэр отключен. Пробовала запускать на разных ОС (windows xp sp3 и windows 7) - ситуация та же.
olegras
У Вас статистика говорит "Получено датаграмм - 73, Ошибки при получении - 1". Так приложение ПК не получает все пакеты или только некоторые? В тестовом файле только две UDP датаграммы 1.1 -> 1.5. Сколько реально было передано?
gosha-z
Винда лупит с разных портов огромными пакетами. Для udp это не гуд...
Hatory
Перед запуском приложения на ПК ввожу команду netstat -s -p UDP 5
выводится следующее:

Статистика UDP для IPv4
Получено датаграм = 321
Отсутствие портов = 42
Ошибки при получении = 2
Отправлено датаграмм = 359

Запускаю приложение, которое в цикле отправляет несколько байт данных и ожидает пакет с 1024 байтами. Приложение зависает на приеме.
Тем временем в командной строке выводится обновленная информация:

Статистика UDP для IPv4
Получено датаграм = 321
Отсутствие портов = 42
Ошибки при получении = 3
Отправлено датаграмм = 360

В тестовом файле приведена полная информация об обмене данными между ПЛИС и ПК в результате ping и двух запусков приложения.
gosha-z
Цитата(Hatory @ Jan 21 2014, 11:00) *
Запускаю приложение, которое в цикле отправляет несколько байт данных и ожидает пакет с 1024 байтами.

У вас приложение что, в каждой итерации цикла биндится к другому порту???
Hatory
Цитата(gosha-z @ Jan 21 2014, 10:05) *
У вас приложение что, в каждой итерации цикла биндится к другому порту???

Нет, в тестовом файле приведен результат двух запусков приложения.
gosha-z
Я бы уменьшил размер пакета. 1024 для udp - многовато.
Hatory
Я пробовала и 50, и 80, и 256 байт - всё тоже.
gosha-z
Ну тогда показывайте кусок проги, относящийся к socket/bind(хотя его у вас нет)/recv/recvfrom
Hatory
Основной код:

CODE
SOCKET Socket;
char ServerAddress [100] = "192.168.1.1";
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(ServerAddress);
if (service.sin_addr.s_addr == INADDR_NONE)
{
MessageBox (hwndMain, _T("Bad server address"), _T("Socket error!"), 0);
ExitProcess (-1);
}
service.sin_port = htons(0x1010);

//----------------------
// Connect to server.
while (1)
{
Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (Socket == INVALID_SOCKET)
{
MessageBox (hwndMain, _T("Error at socket(): %ld\n"), _T("Socket error"), 0);
return -1;
}
if ( connect( Socket, (sockaddr *) &service, sizeof(service) ) == SOCKET_ERROR)
{
Sleep (100);
}
else
{
while (1)
{
int ReadCount = 0;
char writebuf[10];
for (int i = 0; i < 128; i++)
{
writebuf[0] = 0x31;
writebuf[1] = 0x66;
writebuf[2] = i + 1;

if (sendto (Socket, writebuf, 3, 0, NULL, NULL) == SOCKET_ERROR)
{
return;
}
int ReadWait = ((i + 1) << 10) - ReadCount;
ReadCount += recvfrom (Socket, &((char *)Buffer)[ReadCount], ReadWait, 0, NULL, NULL);
if (ReadWait > 16000)
{
Sleep (5);
}
}
}
}
}
gosha-z
Ой! Откуда connect на udp????? Может таки почитаете азы socket API?
olegras
wireshark видит принимаемые датаграммы, а приложение не видит. Скорее дело в приложении. Что возвращает connect() ?
gosu-art
Я тут мерил скорость по UDP от ниоса. Может поможет.
Нажмите для просмотра прикрепленного файла
gosha-z
Цитата(olegras @ Jan 21 2014, 11:40) *
wireshark видит принимаемые датаграммы, а приложение не видит. Скорее дело в приложении. Что возвращает connect() ?

connect'а там быть не должно! Вообще!
Hatory
Цитата(gosu-art @ Jan 21 2014, 10:52) *
Я тут мерил скорость по UDP от ниоса. Может поможет.
Нажмите для просмотра прикрепленного файла

Спасибо за пример, изучу.
gosu-art
Нажмите для просмотра прикрепленного файла
А вот простенькая програмка измерения скорости. Вводите IP, Port нажимаете Open. Затем старт. Оправляется pkt[0] = 1 - у меня для ниоса - это команда начала отправки пакетов (соответственно для Stop отправляем pkt[0] = 0). Далее все что приходит от введенного IP и Port - подсчитывается
olegras
Цитата(gosha-z @ Jan 21 2014, 12:58) *
connect'а там быть не должно! Вообще!

Правильно! Вот я наводяще и спрашиваю, что же она возвращает. Автор кода должен уметь не только писать код, но и уметь находить свои баги, включая сделанные по недостаточному знанию ...
Hatory
Цитата(gosu-art @ Jan 21 2014, 12:38) *
Нажмите для просмотра прикрепленного файла
А вот простенькая програмка измерения скорости.


В Wireshark'e виден как входящий, так и исходящий пакеты.
gosu-art
Нужно в начале ввести IP и Порт, затем нажать Open(!). и только потом уже старт. если с делать опен, изменить IP, сделать старт => принимать не будет rolleyes.gif Уж извините над эргономикой особо не думал biggrin.gif
UDP. При старте оправляется одни UDP пакет - команда на старт передачи. Аналогично и по стопу
Hatory
Сделала согласно инструкции, на всякий случай перепроверила. Ничего не изменилось: пакеты не принимаются.
gosu-art
Погонял между 2мя машинами - все работает!
Нажмите для просмотра прикрепленного файла


Вот поток с рабочей платы
Нажмите для просмотра прикрепленного файла
olegras
Судя по скриншотам wireshark'а, у Hatory порты приема и передачи разные. Может дело в этом? udp3 ожидает прием на тот же порт что и порт передачи?
gosu-art
Цитата(olegras @ Jan 21 2014, 14:30) *
Судя по скриншотам wireshark'а, у Hatory порты приема и передачи разные. Может дело в этом? udp3 ожидает прием на тот же порт что и порт передачи?

Совершенно верно

Цитата(gosu-art @ Jan 21 2014, 12:38) *
Нажмите для просмотра прикрепленного файла
Далее все что приходит от введенного IP и Port - подсчитывается
Hatory
Просто для уточнения



gosu-art
Так у вас не правильно считается чек сумма UDP! (Нужно включить соотв галочку в вайршарке). Заполните ее пока нулями! => пакеты выкидываются
Нажмите для просмотра прикрепленного файла
Hatory
Цитата(gosu-art @ Jan 21 2014, 15:20) *
Так у вас не правильно считается чек сумма UDP!

Огромное спасибо - заработало. И спасибо всем кто принял участие в обсуждении.
P.S. Спасибо за конструктивную критику и примеры, приложение обязательно переделаю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.