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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с accept в цикле 
V
    Опции темы
Townsmen
Дата 11.9.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет! Столкнулся з проблемой:
Как нужно правильно принимать новые подключения в многопользовательском сервере?
Я использую бесконечный while цикл  но он останавливается функцией accept() и ждет нового клиента, а мне нужно что бы цикл работал дальше и проверял приходят ли новые сообщения от подключенных клиентов...
Как правильно написать реализовать роботу сервера?
Схема на рисунку:

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  server.jpg 25,41 Kb
PM MAIL   Вверх
boostcoder
Дата 11.9.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



в твоем случае, тебе нужно твой цикл с аксептом поместить в отдельный поток.
либо использовать ioctlsocket() с опцией FIONBIO. это позволит использовать неблокирующий режим сокетов. читать тут: http://msdn.microsoft.com/en-us/library/ms...3(v=vs.85).aspx там и экзампл есть.

либо использовать asio::acceptor::async_accept().

Добавлено через 14 минут и 5 секунд
и вообще, перейди сюда: http://msdn.microsoft.com/en-us/library/ms...5(v=VS.85).aspx и прочти абсолютно все. все вопросы отпадут.

Это сообщение отредактировал(а) boostcoder - 11.9.2011, 17:35
PM WWW   Вверх
boostcoder
Дата 11.9.2011, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(boostcoder @  11.9.2011,  17:34 Найти цитируемый пост)
либо использовать ioctlsocket() с опцией FIONBIO.

да, и select() не забудь.

Добавлено через 2 минуты и 3 секунды
тут есть пример сервера: http://www.win32developer.com/tutorial/win...tutorial_7.shtm

Добавлено через 2 минуты и 39 секунд
http://www.win32developer.com/tutorial/win...tutorial_8.shtm
PM WWW   Вверх
Townsmen
Дата 12.9.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо) Информации предостаточно  smile 

boostcoder, профессионал в сокетах!
PM MAIL   Вверх
boostcoder
Дата 12.9.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(Townsmen @  12.9.2011,  12:58 Найти цитируемый пост)
профессионал в сокетах! 

нее
PM WWW   Вверх
Townsmen
Дата 12.9.2011, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



запустил поток. Как остановить его?
Код

DWORD thID;
HANDLE hThread = CreateThread(NULL,0,hello,0,0,&thID);


Код

DWORD WINAPI hello(LPVOID IpParam)
      {
       ...
      }

PM MAIL   Вверх
Леопольд
Дата 13.9.2011, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Townsmen @  12.9.2011,  23:41 Найти цитируемый пост)
запустил поток. Как остановить его?
Сделать из него return по определённому условию.



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Townsmen
Дата 13.9.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Сделать из него return по определённому условию.


а подробней? где нужно записать условие? если функция int то return 1, а если dword?

Это сообщение отредактировал(а) Townsmen - 13.9.2011, 17:28
PM MAIL   Вверх
Townsmen
Дата 13.9.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



уже разобрался с завершением потокаsmile 

Теперь другой вопрос: как узнать, что клиент разорвал связь с сервером(закрыл приложение) или связь разорвалось по другой причине....мне нужно знать сколько подключено клиентов и в случае разрыва связи уменьшать количество на единицу?
PM MAIL   Вверх
Townsmen
Дата 15.9.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



теперь понял, recv возвращает 0 или -1
PM MAIL   Вверх
RatHat
Дата 20.9.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



если я не ошибаюсь, recv возвращает либо число принятых байт, либо код ошибки.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
Олег2005
Дата 20.9.2011, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Цитата(RatHat @  20.9.2011,  16:31 Найти цитируемый пост)
recv возвращает либо число принятых байт, либо код ошибки. 

Возврат нуля означает предложение другой стороны на закрытие сокета.
Это так наз. нормальное закрытие.
gracefull close
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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