2016-03-02 3 views
0

Я разработал сервер с кодом CКак прекратить сокет принимает блокировки

Я использовал функцию accept(), чтобы мой сервер listenng на давая сокет.

Мой сервер запущен в потоке.

Теперь в другой теме и для некоторых условий я хочу остановить блокировку accept(), а затем закрыть соответствующий сокет.

Как я могу это сделать? Может ли это сделать shutdown()?

+0

Я не уверен, но я подозреваю, что вы могли бы просто «закрыть»() 'сокет, который' accept() 'включен. Возможно, 'shutdown()' делает это. Что случилось, когда вы пробовали? – mah

ответ

2

Классически закрытие сокета из другого потока вызывает вызов accept() с ошибкой. Мне сказали, что это не работает в некоторых версиях Linux, но я не видел никаких доказательств этого - каждый раз, в Windows/Linux, accept() возвращается с ошибкой/исключением.

Другим распространенным решением является проверка некоторого «выключения» атомного булева после каждого возвращения accept(). Когда вы хотите остановить его, установите логическое значение и выполните connect() в стеке localhost, поэтому вы можете вернуть accept() в «нормальный».

1

Это не работает в Windows.

  • Использования sigaction() установить обработчик сигнала для скажем SIGUSR1 ничего не делать, но имея SA_RESTART опцию отключенных (смотрите также раздел «Прерывания системных вызовов и библиотечные функции с помощью обработчиков сигналов» на этом man-page).

  • Затем отправьте процесс блокировки a SIGUSR1 сигнал.

accept вернется -1 и установить errno в EINTR.