Перейти к содержанию
    

Всем добрый вечер.

 

Помогите разобраться со странной проблемой:

На отладочной плате Stratix II GX PCIe собрали систему с модулем triple speed ethernet, для программной части

для Nios был взят драйвер vadimuzzz'а + дописана реализация протокола UDP. Ping успешно проходит. Пакеты

UDP от ПК в ПЛИС приходят, ответные пакеты видны в Wireshark, но приложение на ПК их не получает. При

просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"

 

988d7634c3c4t.jpg 299db3e8547et.jpg c76161109a8dt.jpg

0803ba084a67t.jpg e14f6d2a6637t.jpg

 

всем откликнувшимся заранее большое спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...При просмотре статистики сетевых протоколов видно, что все принимаемые пакеты с "ошибками при получении"...

А где в Wireshark-е это видно? Может, просто нужно утихомирить firewall?

Выложите в эту тему в архиве лог Wireshark-а ("Test.pcapng") при обмене несколькими UDP-пакетами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за участие.

 

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

Test.pcapng.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас статистика говорит "Получено датаграмм - 73, Ошибки при получении - 1". Так приложение ПК не получает все пакеты или только некоторые? В тестовом файле только две UDP датаграммы 1.1 -> 1.5. Сколько реально было передано?

Изменено пользователем olegras

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перед запуском приложения на ПК ввожу команду netstat -s -p UDP 5

выводится следующее:

 

Статистика UDP для IPv4

Получено датаграм = 321

Отсутствие портов = 42

Ошибки при получении = 2

Отправлено датаграмм = 359

 

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

Тем временем в командной строке выводится обновленная информация:

 

Статистика UDP для IPv4

Получено датаграм = 321

Отсутствие портов = 42

Ошибки при получении = 3

Отправлено датаграмм = 360

 

В тестовом файле приведена полная информация об обмене данными между ПЛИС и ПК в результате ping и двух запусков приложения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

У вас приложение что, в каждой итерации цикла биндится к другому порту???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас приложение что, в каждой итерации цикла биндится к другому порту???

Нет, в тестовом файле приведен результат двух запусков приложения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Основной код:

 

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);
			}
		}
	}		
}
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

wireshark видит принимаемые датаграммы, а приложение не видит. Скорее дело в приложении. Что возвращает connect() ?

Изменено пользователем olegras

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...