| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
да, и 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 |
| Спасибо) Информации предостаточно boostcoder, профессионал в сокетах! |
| Автор: boostcoder 12.9.2011, 13:58 |
нее |
| Автор: Townsmen 12.9.2011, 23:41 | ||||
запустил поток. Как остановить его?
|
| Автор: Леопольд 13.9.2011, 08:15 |
| Сделать из него return по определённому условию. |
| Автор: Townsmen 13.9.2011, 17:04 | ||
а подробней? где нужно записать условие? если функция int то return 1, а если dword? |
| Автор: Townsmen 13.9.2011, 21:43 |
| уже разобрался с завершением потока Теперь другой вопрос: как узнать, что клиент разорвал связь с сервером(закрыл приложение) или связь разорвалось по другой причине....мне нужно знать сколько подключено клиентов и в случае разрыва связи уменьшать количество на единицу? |
| Автор: Townsmen 15.9.2011, 19:43 |
| теперь понял, recv возвращает 0 или -1 |
| Автор: RatHat 20.9.2011, 17:31 |
| если я не ошибаюсь, recv возвращает либо число принятых байт, либо код ошибки. |
| Автор: Олег2005 20.9.2011, 19:58 |
Возврат нуля означает предложение другой стороны на закрытие сокета. Это так наз. нормальное закрытие. gracefull close |