Прерывание соединительной розетки wsa - PullRequest
0 голосов
/ 10 марта 2012

Мне было просто интересно, можно ли прервать вызов функции подключения Windows Socket?

Проблема в том, что мой код требует, чтобы это делалось в другом потоке (поэтому поток GUI продолжает работать). Но когда программа закрыта, мои потоки, вызывающие «connect», ожидают исключения WSAETIMEDOUT.

Есть идеи?

Обновление / Подсказка: я не могу вызвать close (), так как у меня есть только правильный дескриптор, когда connect () возвращается. последнее не относится к случаям использования блокирующих сокетов и наличия tcp-соединения с брандмауэром (например): /

1 Ответ

0 голосов
/ 11 марта 2012

Если сокет находится в режиме блокировки, единственный способ прервать вызов connect() - это закрыть сокет из контекста потока, отличного от того, который вызывает connect(). connect() вернет ошибку, и поток сможет нормально завершить работу.

Если сокет находится в неблокирующем или перекрывающемся режиме, connect() немедленно вернется с ошибкой WSAEWOULDBLOCK, а затем вам придется вызвать select(), WSAAsyncSelect(FD_CONNECT) или WSAEventSelect(FD_CONNECT), чтобы определить, когда соединение было установлено, прежде чем продолжить работу вашего сокета. Поскольку вызывающий поток не заблокирован на connect(), он может периодически проверять наличие любых сигналов завершения / прерывания от остальной части вашего кода, а в случае обнаружения затем закрывать сокет (при необходимости) и нормально выходить из себя.

Если вы пишете свой код сокета в неблокирующем или перекрывающемся режиме, вам не нужно использовать поток. Вы можете выполнять работу со своими сокетами в основном потоке, не блокируя пользовательский интерфейс, тогда вы можете просто закрыть сокет, когда это необходимо. Для такого кода требуется немного больше работы, но это работает. Или вы можете продолжить использовать поток. Он будет отделять код вашего сокета от кода вашего пользовательского интерфейса и, следовательно, будет более управляемым.

...