Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Прерывание цикла по внешнему сигналу |
Автор: Nuzur 6.7.2006, 11:36 |
Есть цикл он выполяняеться до тех пор пока булевская переменная не приймет значение true. Суть вопроса - в цыкле стоит ожидание accept от сокета, но в какой-то момент времени пользователь может захоткть грохнуть сервер, а он стоит в режиме ожидания соеденения в цыкле, как быть-то? |
Автор: Daevaorn 6.7.2006, 11:43 |
Nuzur, каждую итерацию(или не каждую, это уже мелочи ) цикла опрашивай ввод пользователя, если конечно сервер нельзя грохнуть просто нажав "Х". |
Автор: adonin 6.7.2006, 12:44 |
Если я правильно понял вопрос, делайте ассинхронные сокеты: см. API: WSAAsyncSelect() ioctlsocket() Или делайте многопоточное приложение: в одном потоке выполняйте обработку пользовательских событий, а в другом - работайте с сокетами. |
Автор: Nuzur 6.7.2006, 17:03 |
Daevaorn, Каждую итерацию я и буду проверять но проблема то в том что пока сервер ждет клиента он будет его ждать а не проверять что-то там. А если клиент не будет подключаться несколько дней что ему весеть-то? А такое вполне возможно. adonin, Сервер клиент уже сделаны и ОЧЕНЬ не хочеться там что-то менять, может есть другой способ-то? А про многопоточное да оно уже и так многопотоное. Делая его еще многопоточнее... ну прийдеться конечно наверно... ![]() Ладно, может оффтоп уже но тема то незакончена, как потом грамотно поток обрубить когда пойму что время пришло? |
Автор: Fazil6 7.7.2006, 01:02 | ||
грамотно - это когдапоток сам завершится, так что по твоему алгоритму - проверять из потока флаг остановки. Все способы грохнутьпоток извне считаются некорректными. А если у тебя клиент бесконечно ждет подключения,то это поумолчанию неправильно. Надо делать отдельные попытки подключиться, которые должны ограничиваться по времени. Между этими попытками и проверяй флаг остановки. |
Автор: Earnest 7.7.2006, 06:36 |
Только лучше не флаг, а событие... И не проверять, а ждать (WaitForMultipleObjects): пришел один хандл - что-то делаем, пришел другой - завершаемся. |
Автор: Fazil6 7.7.2006, 20:36 | ||
|
Автор: bsa 7.7.2006, 21:33 |
Nuzur Используя http://unixhelp.ed.ac.uk/CGI/man-cgi?fcntl+2 (fcntl.h) устанавливаешь на дескриптор соединения флаг O_NONBLOCK. После этого accept завершается сразу после вызова либо с установкой соединения, либо с кодом errno=EAGAIN (повторите позже)... Можно использовать http://unixhelp.ed.ac.uk/CGI/man-cgi?select+2 (unistd.h) для ожидания с таймаутом. На сколько я знаю, в Windows что-то очень похожее. |