UDP-сервер подключается и отправляет данные странности - PullRequest
0 голосов
/ 16 сентября 2011

Я делаю асинхронные (хорошо не блокирующие Rly) сокеты lib для образовательных целей.Часть TCP работает просто отлично, но когда дело доходит до UDP, у меня странное поведение.Следующий код работает должным образом - сервер получает данные:

MyUDPSocket server;
server.Bind(5551);

MyUDPSocket client;
client.Connect("192.168.0.103", 5551);
Sleep(10);
client.Write("\x0", 1);
Sleep(10);
client.Write("test", 5);

Но если либо Sleep (), либо client.Write ("\ x0", 1);закомментировано - перестает работать.Сервер просто не получит данные.Вот некоторые части моей библиотеки, чтобы вы могли понять, как именно создаются сокеты:

s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
...............................................
memset( &name, 0, sizeof(name) );
name.sin_family = AF_INET;
name.sin_port = htons( port );
hostent* hostinfo = gethostbyname( address );
name.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr;

connect(s, (sockaddr*)&name, sizeof name)

Ничего особенного, как вы видите.Может быть, есть какое-то невысказанное правило, что для отправки соединения требуется один байт данных или что-то еще?Я действительно запутался здесь.

Редактировать: написать функцию по запросу.Переменная name такая же, как и в вызове Connect, код которого указан выше.

virtual int Write( void* data, int size )
{
    return sendto(s, (const char*)data, size, 0, (sockaddr*)&name, sizeof name);
}

Редактировать: Также в цикле select () я проверяю, только ли сокеты читаемы.Может ли быть так, что сокет не доступен для записи из-за инициализации соединения?Если это так, это должно решить Первый сон.Но как насчет отправки одного байта?

...