Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > проблема с accept в цикле


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

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

либо использовать http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/basic_socket_acceptor/async_accept.html.

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

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

да, и http://msdn.microsoft.com/en-us/library/ms740141(v=vs.85).aspx не забудь.

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

Добавлено через 2 минуты и 39 секунд
http://www.win32developer.com/tutorial/winsock/winsock_tutorial_8.shtm

Автор: Townsmen 12.9.2011, 12:58
Спасибо) Информации предостаточно  smile 

boostcoder, профессионал в сокетах!

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

нее

Автор: Townsmen 12.9.2011, 23:41
запустил поток. Как остановить его?
Код

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


Код

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

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

Автор: Townsmen 13.9.2011, 17:04
Цитата

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


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

Автор: Townsmen 13.9.2011, 21:43
уже разобрался с завершением потокаsmile 

Теперь другой вопрос: как узнать, что клиент разорвал связь с сервером(закрыл приложение) или связь разорвалось по другой причине....мне нужно знать сколько подключено клиентов и в случае разрыва связи уменьшать количество на единицу?

Автор: Townsmen 15.9.2011, 19:43
теперь понял, recv возвращает 0 или -1

Автор: RatHat 20.9.2011, 17:31
если я не ошибаюсь, recv возвращает либо число принятых байт, либо код ошибки.

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

Возврат нуля означает предложение другой стороны на закрытие сокета.
Это так наз. нормальное закрытие.
gracefull close

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)