![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
Sphinx |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Написал стандартную функцию сервера, но она, если нет соединения, останавливается на accept. Мне же нужно периодически проверять состояние одной глобальной переменной. Как я понял подобное можно сделать с помощью select. Но ничего не получается. Дайте простейший пример сервера с использованием select.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: нет Всего: 59 |
Я ничего не понял, если честно...
Что такое стандартная функция сервера? Нужно периодически просматривать появилось ли соединение? |
|||
|
||||
Sphinx |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Я имел ввиду, что использовал стандартний пример сервера, которые есть во многих учебниках.
А проверять надо состояние переменной совершенно не имеющей отношение к сети. В общем надо чтобы сервер не зависал на accept, а организовать перед ним цикл, в котором делать проверку на появление соединения ну и попутно просматривать эту переменную. |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 1 Всего: 121 |
Создай функцию с accept в отдельном потоке или используй WSAAccept
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Есть много способов: использовать select с установленным timeout, использовать неблокирующие сокеты, использовать многопоточность, или установить таймер. Выбирай любой.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
Sphinx |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.7.2006 Репутация: нет Всего: нет |
Поясню, более конкретно, чего я хочу. Может будут другие варианты, как это реализовать. Сервер запускается в отдельном потоке, который создает загружаемый плагин. При выгрузке плагина, хочется, чтобы сервер корректно завершал свою работу. В блокирующем режиме сервер вызывает accept и управление к нему не возвращается (пока кто-то не создаст соединение). Была идея перед вызовом accept сделать цыкл в котором с помощью select определять попытку соединения, но ничего не получилось. Потом попробовал использовать неблокирующий сокет. Вот код сервера:
Все отрабатывает как надо, кроме завершения работы - зависает на вызова WSACleanup(). Вот код главного потока:
|
||||
|
|||||
Enelar |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 13.1.2008 Репутация: нет Всего: 1 |
Что именно у вас не получилось?
Собственно на сокете, находящемся в состоянии прослушки, функция оставит его в массиве согласно пункту один - если есть входящее соединение, и следующий вызов функции accept не заблокирует приложение. Есть небольшая особенность с функцией select - она не расчитанна на вызов в массиве, нужно делать хотя бы Sleep(1) а лучше 10. А вообще для подобных целей есть только 2 норм варианта 1) Слушающий поток, отдельный. Блокируется в функции accept, при ее успехе завершается с кодом - входящий сокет, или 0 если ошибка. В основном потоке проверяется не завершился ли дополнительный. Возможны модификации. 2) Использование неблокирующих сокетов(что по моему личному мнению намного лучше). |
||||
|
|||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |