Помогите чайнику с UDP сервером!!!
Либо установка не может их послать, либо ты не успеваешь их получить. Если данные посылаются очень быстро, то всё, что ты не успел получить, пропадёт. Напиши код, с помощью которого ты пытаешься получить эти данные, а так же под какой ОС ты работаешь.
#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
Я перехватывал эти пакеты Ethereal'ом, все пакеты приходили в нормальном состоянии
Ты не успеваешь получить всё, что приходит на сокет. Попробуй убрать gethostbyaddr и все printf в другой поток. Или, попроще, сначала сохрани все полученные пакеты в каком-нибудь массиве.
Сделай как майк сказал - сначала считывай всё в массив - потом разгребай,
либо в разных потоках это делай.
массив не канает
только параллельный поток
один закидывает в очередь, а дургой оттуды забирает
26 пакетов по 1002 байта... проще массив сделать.
Оставить комментарий
self-in-use
Мне требуется принимать данные с установки по протоколу UDP.Установка выдает 26 пакетов по 1002 байта с задержкой 0,8мс
Простой UDP ECHO сервер, написанный на С++, принимает только 10 пакетов, а остальное пропадает неизвестно куда.
Подскжите, пожалуйста, в чем тут дело.