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

Прием пакетов по UDP (Visual Studio)

Не совсем. Он существует для телефонов на Symbian (усилиями Нокиа) и для других мобильных платформ http://en.wikipedia.org/wiki/Qt_%28framework%29#Platforms. Но точно так же Qt существует для десктопных платформ. Изначально библиотека создавалась чтобы быть именно дескптоным кроссплатфоремнным гуем, потом разрослась.

Я только-только с Borland C++ пересел на VS2010 т.к. есть возможность бесплатного использования. Сразу пересаживаться еще на что-то - мне кажется так я ничего не сделаю. В любом случае спасибо за пдсказку. Обязательно присмотрюсь.

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


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

Во первых UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа.

Во вторых, проект с передатчиком и приёмником UDP прилагаю.

В третьих , когда ж прекратите с этим пропертарным раром баловаться.

 

Опробовал предложенный Вами проект. Все отлично работает. Однако возникли два вопроса. 1) В части wfListener я не нашел буфера (массива) в который поступают принятые данные и из которого можно было бы их брать; 2) нужно объединить в один wfListener и wfSender. Будет очень удобно иметь возможность как принмать данные, так и слать команды из одной формы.

 

Спасибо.

 

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


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

SOCKET Socket;

volatile bool stop = false;

// Рабочий поток, разгребаем принятое...

UINT threadLAN(LPVOID foo)
{
fd_set fds; 

struct timeval timeout; 

while(!stop)
{
	timeout.tv_sec = 0; 
	timeout.tv_usec = 100; 

	FD_ZERO(&fds); 
	FD_SET(pDlg->Socket, &fds); 

	int rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout); 
	if(rc > 0) 
	{ 
		char rbuf[1024]; 

		SOCKADDR_IN clientaddr; 

		int len = sizeof(clientaddr);
		int sz = recvfrom(pDlg->Socket, rbuf, 1024, 0, (sockaddr *) &clientaddr, &len);
		if(sz == /* проверка на размер полученных данных */) 
		{
			/* разгребаем данные в rbuf[] */
		}   
	}
}

return 0;
}

// Инициализация...

bool ok = true;

WSADATA wd;
WSAStartup(1, &wd);

Socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
if(Socket == -1) 
{ 
MessageBox(L"Error creating UDP socket");

ok = false;
} 

SOCKADDR_IN UDPserveraddr; 
memset(&UDPserveraddr,0, sizeof(UDPserveraddr)); 

UDPserveraddr.sin_family = AF_INET; 
UDPserveraddr.sin_port = htons(5520 /* Номер порта */); 
UDPserveraddr.sin_addr.s_addr = INADDR_ANY; /* Приём с любого адреса, в т.ч. широковещательные */

int len = sizeof(UDPserveraddr); 

if(bind(Socket, (SOCKADDR *) &UDPserveraddr, sizeof(SOCKADDR_IN)) < 0) 
{ 
MessageBox(L"Error binding UDP socket"); 

ok = false;
}

if(ok)
{
AfxBeginThread(threadLAN, NULL);
}

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


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

Спасибо. Посоветуйте что почитать про устройство программы Windows Form C# VS2010? Вот в какое место пустого проекта вставить предложенный Ваи код? Простите чайника...

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


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

Вот в какое место пустого проекта вставить предложенный Ваи код?
Оно не C#, оно C\C++ с лёгким налетом MFC (к сути отношения не имеет, но в коде упомянут).

 

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


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

Мне бы в самой структуре проекта разобраться. Вот как разместить код чтобы можно было пользоваться функциями и глобальными переменными во всех файлах проекта? Уровень практически чайниковский...

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


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

Мне было проще разобраться на примерах из http://www.winpcap.org/ и принемать с помощью их библиотек. Все они для Visual C++. Надо установить WinPCap и в его папках будут примеры.

 

+ пакеты удобно смотреть с помощью программы http://www.wireshark.org/

 

Принемаю UDP пакеты на скоростях около 600 Mbps, MTU 8kbyte, в обратную сторону идут команды управления. Пакеты компьютер иной раз теряет, но обычно несколько сот мегабайт за пару сек принемаю без потерь)) Matlab с такой задачей не справлялся

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

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


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

Обязательно посмотрю, спасибо! В целом на передложенном в начале примере разобрался, пока все работает. Сейчас больше вопросов общего характера по VS2010 C#.

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


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

Хм.

Наверно так ,

1. Установите VS2010 C# , возьмите книжку Рихтера, почитайте об CLR и С# в частности

2. Возмите любую книгу по программрованию Windows GUI, почитайте о событийной модели.

3. Пример рабочий передатчика и приёмника UDP пакетов , я вам дал.

 

Зы: Киев большой, найди рядом программиста он на пальцах вам обьяснит. Программирование , пока , не ваше.

Ух как быстро летит время. Да, Ваше решение хорошо работает и сейчас очень кстати. Программирование конечно у меня хромает, потому прошу помощи. Пытаюсь в Вашем Listener разбирать посылку в 64 байта. Работает. Но через время (около минуты) самопроизвольно закрывается. Успевает принять не более 2000 пакетов по 64 байта. Что не так? Исходник со своими "включениями" прилагаю. Спасибо.

UDP_Solution.zip

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


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

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

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

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

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

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

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

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

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

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