Помогите чайнику с UDP сервером!!!

self-in-use

Мне требуется принимать данные с установки по протоколу UDP.
Установка выдает 26 пакетов по 1002 байта с задержкой 0,8мс
Простой UDP ECHO сервер, написанный на С++, принимает только 10 пакетов, а остальное пропадает неизвестно куда.
Подскжите, пожалуйста, в чем тут дело.

kokoc88

Либо установка не может их послать, либо ты не успеваешь их получить. Если данные посылаются очень быстро, то всё, что ты не успел получить, пропадёт. Напиши код, с помощью которого ты пытаешься получить эти данные, а так же под какой ОС ты работаешь.

self-in-use

#include <stdio.h>
#include <winsock2.h>
#include <iostream.h>
#define PORT 5002 // порт сервера

int main
{
char buff[1024]="";
int i;
printf("UDP echo-Server\n");

// шаг 1 - подключение библиотеки
if (WSAStartup(MAKEWORD(2,2WSADATA *) &buff[0]
{
printf("WSAStartup error: %d\n",
WSAGetLastError;
return -1;
}

// шаг 2 - создание сокета
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_DGRAM,0);
if (my_sock==INVALID_SOCKET)
{
printf("Socket error: %d\n",WSAGetLastError;
WSACleanup;
return -1;
}

// шаг 3 - связывание сокета с локальным адресом
sockaddr_in local_addr;
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=INADDR_ANY;
local_addr.sin_port=htons(PORT);

if (bind(my_socksockaddr *) &local_addr,
sizeof(local_addr
{
printf("bind error: %d\n",WSAGetLastError;
closesocket(my_sock);
WSACleanup;
return -1;
}

// шаг 4 обработка пакетов, присланных клиентами
for(int j=1;j<26;j++)
{
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
int bsize=recvfrom(my_sock,buff,
sizeof(buff0,
(sockaddr *) &client_addr, &client_addr_size);
if (bsize==SOCKET_ERROR)
printf("recvfrom error: %d\n",
WSAGetLastError;

// Определяем IP-адрес клиента и прочие атрибуты
HOSTENT *hst;
hst=gethostbyaddrchar *)
&client_addr.sin_addr,4,AF_INET);
printf("+%s [%s:%d] new DATAGRAM!\n",
(hst)?hst->h_name:"Unknown host",
inet_ntoa(client_addr.sin_addr
ntohs(client_addr.sin_port;
i=printf("%d",bsize);

// Вывод на экран
printf("\n %s \n",buff);
}
return 0;
}

Работаю под WindowsXP SP2

self-in-use

Я перехватывал эти пакеты Ethereal'ом, все пакеты приходили в нормальном состоянии

kokoc88

Ты не успеваешь получить всё, что приходит на сокет. Попробуй убрать gethostbyaddr и все printf в другой поток. Или, попроще, сначала сохрани все полученные пакеты в каком-нибудь массиве.

Codcod

Такой формат программы не работает на потоке.... слишком медленно
Сделай как майк сказал - сначала считывай всё в массив - потом разгребай,
либо в разных потоках это делай.

pitrik2

а если постоянно чтото приходит?
массив не канает
только параллельный поток
один закидывает в очередь, а дургой оттуды забирает

Codcod

26 пакетов по 1002 байта... проще массив сделать.
Оставить комментарий
Имя или ник:
Комментарий: