TCP-соединения с перекрытым вводом / выводом

#winapi #tcp #winsock #overlapped-io #request-cancelling

#winapi #tcp #winsock #перекрытый ввод-вывод #отмена запроса

Вопрос:

Возможно ли инициировать запрос TCP-соединения с перекрытым вводом / выводом и отменить его до завершения подключения в Windows? Мне нужно поддерживать как минимум Windows XP SP2.

Ответ №1:

ConnectEx разрешает попытку перекрытого подключения.

Чтобы отменить это, нужно было бы использовать CancelIo передачу SOCKET , как если бы это было HANDLE (это действительно так). Но это должно быть сделано из того же потока, который вызвал ConnectEx . Управлять вещами, чтобы вы могли достичь этой специфичности потока, вряд ли будет легко.

После XP / 2003 (т.е. Vista/2008/8/ 2008R2) вы можете использовать CancelIoEx из другого потока ( OVERLAPPED экземпляр используется для полной идентификации операции ввода-вывода).

Комментарии:

1. Вероятно, вы могли бы также отменить эту попытку подключения, просто закрыв сокет; тогда ConnectEx() завершится с ошибкой…

2. @Richard: Потрясающе, спасибо! Я буду отменять из того же потока, который вызвал вызов ConnectEx(), так что это не будет проблемой. Но кто-нибудь знает, что происходит на уровне TCP? Предположим, что SYN был отправлен, будет ли отмена подключения отправлять RST на другую сторону или это сохранит рукопожатие зависшим?

Ответ №2:

Отсюда:

перекрытие

В этом каталоге содержится пример серверной программы, использующей перекрытый ввод-вывод. Пример программы использует функцию AcceptEx и перекрытый ввод-вывод для эффективной обработки нескольких асинхронных запросов на подключение от клиентов. Сервер использует функцию AcceptEx для мультиплексирования различных клиентских подключений в однопоточном приложении Win32. Использование перекрытого ввода-вывода обеспечивает большую масштабируемость.