#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. Использование перекрытого ввода-вывода обеспечивает большую масштабируемость.