проблема с accept в цикле

 
0
 
C++
ava
Townsmen | 11.09.2011, 16:56
Всем привет! Столкнулся з проблемой:
Как нужно правильно принимать новые подключения в многопользовательском сервере?
Я использую бесконечный while цикл  но он останавливается функцией accept() и ждет нового клиента, а мне нужно что бы цикл работал дальше и проверял приходят ли новые сообщения от подключенных клиентов...
Как правильно написать реализовать роботу сервера?
Схема на рисунку:
Ответы (11)
ava
boostcoder | 11.09.2011, 17:34 #
в твоем случае, тебе нужно твой цикл с аксептом поместить в отдельный поток.
либо использовать ioctlsocket() с опцией FIONBIO. это позволит использовать неблокирующий режим сокетов. читать тут: http://msdn.microsoft.com/en-us/library/ms...3(v=vs.85).aspx там и экзампл есть.

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

Добавлено позднее:
и вообще, перейди сюда: http://msdn.microsoft.com/en-us/library/ms...5(v=VS.85).aspx и прочти абсолютно все. все вопросы отпадут.
ava
boostcoder | 11.09.2011, 22:55 #
Цитата (boostcoder @  11.9.2011,  17:34 findReferencedText)
либо использовать ioctlsocket() с опцией FIONBIO.

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

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

Добавлено позднее:
http://www.win32developer.com/tutorial/win...tutorial_8.shtm
ava
Townsmen | 12.09.2011, 12:58 #
Спасибо) Информации предостаточно  smile 

boostcoder, профессионал в сокетах!
ava
boostcoder | 12.09.2011, 13:58 #
Цитата (Townsmen @  12.9.2011,  12:58 findReferencedText)
профессионал в сокетах! 

нее
ava
Townsmen | 12.09.2011, 23:41 #
запустил поток. Как остановить его?

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



DWORD WINAPI hello(LPVOID IpParam)
      {
       ...
      }
ava
Леопольд | 13.09.2011, 08:15 #
Цитата (Townsmen @  12.9.2011,  23:41 findReferencedText)
запустил поток. Как остановить его?
Сделать из него return по определённому условию.
ava
Townsmen | 13.09.2011, 17:04 #
Цитата


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



а подробней? где нужно записать условие? если функция int то return 1, а если dword?
ava
Townsmen | 13.09.2011, 21:43 #
уже разобрался с завершением потока:)

Теперь другой вопрос: как узнать, что клиент разорвал связь с сервером(закрыл приложение) или связь разорвалось по другой причине....мне нужно знать сколько подключено клиентов и в случае разрыва связи уменьшать количество на единицу?
ava
Townsmen | 15.09.2011, 19:43 #
теперь понял, recv возвращает 0 или -1
ava
RatHat | 20.09.2011, 17:31 #
если я не ошибаюсь, recv возвращает либо число принятых байт, либо код ошибки.
ava
Олег2005 | 20.09.2011, 19:58 #
Цитата (RatHat @  20.9.2011,  16:31 findReferencedText)
recv возвращает либо число принятых байт, либо код ошибки. 

Возврат нуля означает предложение другой стороны на закрытие сокета.
Это так наз. нормальное закрытие.
gracefull close
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить