|
Прием пакетов по UDP (Visual Studio), Windows Form |
|
|
|
Jan 11 2013, 16:19
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Ken@t @ Dec 7 2012, 13:01)  Во первых UDP использует простую модель передачи, без неявных "рукопожатий" для обеспечения надежности, упорядочивания или целостности данных. Таким образом, UDP предоставляет ненадежный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа. Во вторых, проект с передатчиком и приёмником UDP прилагаю. В третьих , когда ж прекратите с этим пропертарным раром баловаться. Опробовал предложенный Вами проект. Все отлично работает. Однако возникли два вопроса. 1) В части wfListener я не нашел буфера (массива) в который поступают принятые данные и из которого можно было бы их брать; 2) нужно объединить в один wfListener и wfSender. Будет очень удобно иметь возможность как принмать данные, так и слать команды из одной формы. Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 14 2013, 04:58
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
CODE 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); }
|
|
|
|
|
Feb 1 2013, 19:36
|

Участник

Группа: Участник
Сообщений: 54
Регистрация: 29-08-07
Из: Красногорск
Пользователь №: 30 128

|
Мне было проще разобраться на примерах из http://www.winpcap.org/ и принемать с помощью их библиотек. Все они для Visual C++. Надо установить WinPCap и в его папках будут примеры. + пакеты удобно смотреть с помощью программы http://www.wireshark.org/Принемаю UDP пакеты на скоростях около 600 Mbps, MTU 8kbyte, в обратную сторону идут команды управления. Пакеты компьютер иной раз теряет, но обычно несколько сот мегабайт за пару сек принемаю без потерь)) Matlab с такой задачей не справлялся
Сообщение отредактировал Manfred - Feb 1 2013, 19:40
|
|
|
|
|
Aug 11 2015, 14:50
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Ken@t @ Dec 8 2012, 10:09)  Хм. Наверно так , 1. Установите VS2010 C# , возьмите книжку Рихтера, почитайте об CLR и С# в частности 2. Возмите любую книгу по программрованию Windows GUI, почитайте о событийной модели. 3. Пример рабочий передатчика и приёмника UDP пакетов , я вам дал.
Зы: Киев большой, найди рядом программиста он на пальцах вам обьяснит. Программирование , пока , не ваше. Ух как быстро летит время. Да, Ваше решение хорошо работает и сейчас очень кстати. Программирование конечно у меня хромает, потому прошу помощи. Пытаюсь в Вашем Listener разбирать посылку в 64 байта. Работает. Но через время (около минуты) самопроизвольно закрывается. Успевает принять не более 2000 пакетов по 64 байта. Что не так? Исходник со своими "включениями" прилагаю. Спасибо.
UDP_Solution.zip ( 143.18 килобайт )
Кол-во скачиваний: 42
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|