2011-09-21 4 views
2

Winsock connect 기능이 실행되는 동안 TerminateThread을 사용할 때 어떤 문제가 발생할 수 있습니까? 현재 소켓에 연결되어있는 스레드를 즉시 종료해야하지만 네트워크 어댑터에 어떤 일이 발생할 수 있는지 알지 못합니다.Winsock 연결 기능에서 강제로 스레드를 종료 할 때 어떤 일이 발생할 수 있습니까?

connect 함수에는 아쉽게도 시간 초과 매개 변수가 없으며 기본 시스템 시간 초과 값이 너무 높습니다. 그렇다면이 API 함수를 방해 할 위험이 있습니까?

필자는 Delphi에서 응용 프로그램을 작성하고 있기 때문에 Delphi 태그를 사용했지만, Winsock 및 Windows API 질문이 훨씬 많습니다.

감사합니다.

답변

2

connect() 전화를 중단 할 수있는 유일한 방법은 다른 스레드 컨텍스트에서 소켓을 닫는 것입니다. 그렇지 않으면 마침표와 같이 I/O가 겹친 ConnectEx()을 사용하십시오.

+0

정말 고마워요. 이것은 정확히 내가 찾고 있었던 것입니다 (질문이 약간 다르게 표현 된 경우 라 할지라도). 실제로 [연결] (http://msdn.microsoft.com/en-us/library/ms737625%28v=VS.85%29.aspx) 진행 상황은 [closesocket] (http : // msdn. microsoft.com/en-us/library/ms737582%28v=VS.85%29.aspx) 함수는 다른 스레드 컨텍스트에서 작동합니다. 이것은 많은 upvotes과 내 측면에서 또한 acception받을 가치가있어. 다시 한 번 감사드립니다! – TLama

0

전화를 걸면 많은 메모리와 리소스가 누출됩니다. 프로그램을 종료하기 직전에 이렇게하면 괜찮을 수도 있습니다 (어쨌든 좋지는 않지만 ...). 그러나 프로그램 실행 중에 여러 번 이렇게하면 프로그램이 마침내 중단됩니다. 메모리가 없습니다. 네트워크 어댑터와 해당 드라이버는 정상적으로 작동하며 버그가있는 사용자 모드 프로그램으로부터 보호됩니다.

0

중첩 호출에서 ConnectEx()를 사용 하시겠습니까? hEvent에서 이벤트 객체 (TEvent, say)를 사용하고 WaitForMultipleObjects()를 사용하여 종료 자 이벤트를 기다리거나 완료 루틴을 사용하고 WaitForSingleObjectEx()가있는 종료자를 루프에서 기다릴 수 있습니다. 결과로 WSA_OUTPUT_PENDING 및 IO_COMPLETION.

이 경우에는 WaitForMultipleObjects()를 사용하여 대기하는 것이 더 쉬울 것이라고 생각합니다.

RGDS, 마틴

관련 문제