Что может произойти, когда я принудительно завершаю поток в функции подключения Winsock? - PullRequest
2 голосов
/ 21 сентября 2011

Что может произойти, если я использую TerminateThread во время выполнения функции Winsock connect ? Мне нужно немедленно отключить поток, который в данный момент подключается к сокету, но я не знаю, что может случиться с сетевым адаптером.

Функция connect , к сожалению, не имеет параметра времени ожидания, а значение системного времени по умолчанию слишком велико. Так есть ли риск прервать эту функцию API?

Я использовал тэг Delphi только потому, что пишу свое приложение на Delphi, но это гораздо больше вопрос о Winsock и Windows API.

Спасибо

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Единственный способ прервать вызов connect() - это закрыть сокет из другого контекста потока.В противном случае используйте ConnectEx() с перекрывающимся вводом / выводом, как сказал Мартин.

0 голосов
/ 21 сентября 2011

Использовать ConnectEx () в перекрывающемся вызове?Вы можете либо использовать объект события (скажем, TEvent) в hEvent и ждать и того, и другого события-терминатора с WaitForMultipleObjects (), или использовать подпрограмму завершения и ждать завершения с помощью WaitForSingleObjectEx () в цикле, который игнорируетWSA_OUTPUT_PENDING и IO_COMPLETION как результаты.

Полагаю, в этом случае было бы проще просто подождать с WaitForMultipleObjects ().

Rgds, Martin

0 голосов
/ 21 сентября 2011

Вызывая TerminateThread, вы создаете огромную утечку памяти и ресурсов. Это может быть нормально, если вы сделаете это непосредственно перед выходом из программы (хотя в любом случае это не хорошо ...). Но если вы сделаете это несколько раз во время выполнения программы, ваша программа в конечном итоге завершится сбоем - нет памяти. С сетевым адаптером и его драйвером все будет в порядке, они хорошо защищены от глючных программ пользовательского режима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...