| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > WSARecv |
| Автор: zss 26.1.2007, 10:32 | ||||||||
создаю сокет
На этом сокете слушает сервер
На запросе сокет вываливает с ошибкой
Код ошибки 10035
Серверу приходит блок данных. Но перед ним идет заголовок. Он всегда одной длинны. В заголовке передается как правило длинна блока. Тоесть сначала сервер вычитывает заголовок. После определеяет длинну данных и вычитывает данные. Так вот если клиент отсылает все сразу, то тогда работает. А если он отсылает тоже кусками (тоесть сначала заголовок, а потом и блок), то сервер заголовок получает, а для того, чтоб получить данные ему приходится ждать (простейший Sleep(100) помог). Почему так ? З.Ы. И еще. событие FD_READ говорит о том, что серверу например пришел запрос. Тоесть поймав это событие можно обменивать данными. Когда сервер пытается отослать данные, то приходит FD_WRITE. Для чего это событие вообще нужно если через него можно определить лишь что сервер что-то пульнул в сокет |
| Автор: Dude03 26.1.2007, 14:34 |
| Насколько мне известно, то так заканчивается recv на асинхронном сокете, если нечего читать. |
| Автор: zss 28.1.2007, 15:09 |
| Dude03, да уменя так и есть - сокет неблокирующий. Но как реализовать ожидание новых событий FD_READ & FD_WRITE ? |
| Автор: zss 28.1.2007, 23:01 | ||
| Dude03, спасибо за подробный ответ. Но как все-таки ожидать. Может проще слушающий сокет сделать неблокирующим, а клиентскиу после WSAAccept блокирующим и для него запускать отдельный поток. А после того как поток отработал - убивать сокет. Но у меня почему-то после
клиент тоже оказывается неблокирующим. Почему ? |
| Автор: Dude03 28.1.2007, 23:07 |
| Проще всего сделать через WSAAsyncSelect и сообщения Windows. Но там надо создать окно, которому и будет приходить сообщения. |
| Автор: zss 28.1.2007, 23:09 | ||||
не - окна не пойдут - у меня сервис
а как это вообще может быть. Я кручу цикл и ловлю события. Как потоку сказать что для него (для сокета которым он владеет) пришли еще данные ? Добавлено @ 23:10 Я ведь могу только определить для какого сокета пришло событие |