느린 사용으로 비차단 소켓을 닫으면 누출이 발생할 수 있습니다.
- 아티클
- 2023. 07. 17.
이 문서의 내용
이 문서는 느린 사용 및 느린 시간 제한이 0으로 설정된 비차단 소켓을 닫을 때 누수 문제를 해결하는 데 도움이 됩니다.
원래 제품 버전: Winsock
원래 KB 번호: 2770054
증상
메모리 사용량 및 스레드 핸들 수는 프로그램이 소켓을 닫는 것과 동일한 속도로 증가합니다. 메모리 및 스레드 핸들 누수인 것으로 보입니다.
원인
소켓은 정상 또는 중단 방식으로 종료될 수 있습니다. 소켓이 종료 closesocket 되지 않았고 해당 소켓 closesocket 에서 함수가 호출되면 함수는 소켓을 닫기 전에 소켓을 종료합니다. 이 함수는 closesocket 소켓에서 느린 옵션을 사용하는 경우 정상 종료를 시도합니다.
함수가 closesocket 비차단 소켓을 정상적으로 종료하려고 하면 종료를 수행하는 작업자 스레드를 만들려고 시도합니다. 작업자 스레드는 통신 채널의 다른 쪽 끝에 소켓이 종료되고 있음을 알리려고 시도합니다. 채널의 다른 쪽 끝이 응답하지 않으면 작업자 스레드는 느린 시간 제한이 만료될 때까지 기다립니다. 그런 다음 중단 종료를 수행합니다.
위의 시나리오에서 느린 시간 제한이 0이면 작업자 스레드는 채널의 다른 쪽 끝이 응답할 때까지 무한 시간 동안 대기합니다. 이 스레드는 유용한 작업을 수행할 수 없으며 종료되지 않습니다. 그것은 유출되었습니다. 스레드와 연결된 메모리 및 종료하려는 소켓도 유출되었습니다.
해결 방법
모범 사례는 또는 WSASendDisconnect 함수를 사용하여 소켓을 명시적으로 종료한 shutdown 다음 함수를 호출하는 것입니다closesocket.
또는 느린 시간 제한 값을 0이 아닌 값(예: 1초)으로 설정할 수 있습니다. 작업자 스레드는 소켓을 종료하고 종료하기 전에 지정된 느린 시간 제한 값만 기다립니다.
추가 정보
closesocket 함수 및 작업자 스레드 함수는 .에서 afd.dll구현됩니다.
느린 시간에 대한 자세한 배경 정보는 정상 종료, 느린 옵션 및 소켓 클로저를 참조하세요.
'[Microsoft]' 카테고리의 다른 글
DnsQuery 함수를 사용하여 Visual C++ .NET으로 호스트 이름 및 호스트 주소 확인 (0) | 2023.11.03 |
---|---|
디자인 문제 - Winsock을 사용하여 TCP를 통해 작은 데이터 세그먼트 보내기 (0) | 2023.11.03 |
IPPROTO_IP 수준에서 소켓 옵션을 설정/가져올 때 헤더 및 라이브러리 요구 사항 (0) | 2023.11.03 |
BeginRead 메서드로 인해 InvalidOperationException이 발생합니다. (0) | 2023.11.03 |
SetFileCompletionNotificationModes API로 인해 비 IFS LSP가 설치된 경우 I/O 완료 포트가 제대로 작동하지 않습니다. (0) | 2023.11.03 |