Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не блокирующие сокеты и потоки 
:(
    Опции темы
TiKKi
Дата 13.5.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: нет
Всего: 2



1. К серваку коннектится клиент, его принимаем функций accept(...).

2. Затем, WSAAsynSelect(..., WM_CLIENTEVENT,  FD_READ | FD_CLOSE), этой функцией определяем за какими
событиями на сокете клиента будет наблюдать.

3. Затем, чтобы обработать сообщение WM_CLIENTEVENT получаем что-то вроде такого
    
         ...
         SOCKET  СSock = Message.WParam;
         WORD    WSAEvent = WSAGETSELECTEVENT(Message.LParam);
         switch (WSAEvent)
         {
             ...
                  case FD_READ:
                  {
                           //читаем данные из CSock
                           return;
                  }    
                  ...
         }
         ...

Вопрос в следующем, правильно же будет,если процесс обработки события FD_READ кинуть в поток ? Ведь, если чтение данных от одного клиента затянется, а в это время пришли данные от другого клиента, который ждет ответа.
И тогда, если надо использовать потоки, что делать если опять же чтение данных затянулось и клиент закрыл соединение со своей стороны ? Получается, что FD_READ еще обрабатывается, а уже прилетело FD_CLOSE. 
PM   Вверх
blur
Дата 13.5.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: 1
Всего: 1



Цитата(TiKKi @  13.5.2006,  14:58 Найти цитируемый пост)
И тогда, если надо использовать потоки, что делать если опять же чтение данных затянулось и клиент закрыл соединение со своей стороны ? Получается, что FD_READ еще обрабатывается, а уже прилетело FD_CLOSE.

А как это клиент сможет закрыть соединение, если он не передал еще все данные(буфер)?
 
PM MAIL   Вверх
TiKKi
Дата 14.5.2006, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: нет
Всего: 2



Если работа с сокетом у клиента вынесена в поток и он просто закрывает прогу. Это как вариант, но точно незнаю прилетит ли в этот случае FD_CLOSE. Мне больше интересно, логично ли будет обработку на серваке события FD_READ выносить в поток, вот  smile  
PM   Вверх
MoZy
Дата 5.6.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: -2
Всего: 0



TiKKi, логичнее не придумаешь. smile  
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.