|
Проблема с Ethernet, Ping, но не UDP |
|
|
|
Jan 20 2014, 17:59
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Всем добрый вечер. Помогите разобраться со странной проблемой: На отладочной плате Stratix II GX PCIe собрали систему с модулем triple speed ethernet, для программной части для Nios был взят драйвер vadimuzzz'а + дописана реализация протокола UDP. Ping успешно проходит. Пакеты UDP от ПК в ПЛИС приходят, ответные пакеты видны в Wireshark, но приложение на ПК их не получает. При просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"   всем откликнувшимся заранее большое спасибо!
|
|
|
|
|
Jan 20 2014, 20:10
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(Hatory @ Jan 20 2014, 20:59)  ...При просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"... А где в Wireshark-е это видно? Может, просто нужно утихомирить firewall? Выложите в эту тему в архиве лог Wireshark-а ("Test.pcapng") при обмене несколькими UDP-пакетами.
|
|
|
|
|
Jan 21 2014, 05:29
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Спасибо за участие. "Ошибки при передаче" отображаются не в Wireshark'е, а при использовании команды netstat. Брандмауэр отключен. Пробовала запускать на разных ОС (windows xp sp3 и windows 7) - ситуация та же.
|
|
|
|
|
Jan 21 2014, 07:00
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Перед запуском приложения на ПК ввожу команду netstat -s -p UDP 5 выводится следующее:
Статистика UDP для IPv4 Получено датаграм = 321 Отсутствие портов = 42 Ошибки при получении = 2 Отправлено датаграмм = 359
Запускаю приложение, которое в цикле отправляет несколько байт данных и ожидает пакет с 1024 байтами. Приложение зависает на приеме. Тем временем в командной строке выводится обновленная информация:
Статистика UDP для IPv4 Получено датаграм = 321 Отсутствие портов = 42 Ошибки при получении = 3 Отправлено датаграмм = 360
В тестовом файле приведена полная информация об обмене данными между ПЛИС и ПК в результате ping и двух запусков приложения.
|
|
|
|
|
Jan 21 2014, 07:05
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Цитата(Hatory @ Jan 21 2014, 11:00)  Запускаю приложение, которое в цикле отправляет несколько байт данных и ожидает пакет с 1024 байтами. У вас приложение что, в каждой итерации цикла биндится к другому порту???
|
|
|
|
|
Jan 21 2014, 07:07
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Цитата(gosha-z @ Jan 21 2014, 10:05)  У вас приложение что, в каждой итерации цикла биндится к другому порту??? Нет, в тестовом файле приведен результат двух запусков приложения.
|
|
|
|
|
Jan 21 2014, 07:18
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Я пробовала и 50, и 80, и 256 байт - всё тоже.
|
|
|
|
|
Jan 21 2014, 07:35
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 29-06-11
Из: Казань
Пользователь №: 65 974

|
Основной код: 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); } } } } }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|