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