느린 사용으로 비차단 소켓을 닫으면 누출이 발생할 수 있습니다.

  • 아티클
  • 2023. 07. 17.
  •  

이 문서의 내용

  1. 증상
  2. 원인
  3. 해결 방법
  4. 추가 정보

이 문서는 느린 사용 및 느린 시간 제한이 0으로 설정된 비차단 소켓을 닫을 때 누수 문제를 해결하는 데 도움이 됩니다.

원래 제품 버전: Winsock
원래 KB 번호: 2770054

증상

메모리 사용량 및 스레드 핸들 수는 프로그램이 소켓을 닫는 것과 동일한 속도로 증가합니다. 메모리 및 스레드 핸들 누수인 것으로 보입니다.

원인

소켓은 정상 또는 중단 방식으로 종료될 수 있습니다. 소켓이 종료 closesocket 되지 않았고 해당 소켓 closesocket 에서 함수가 호출되면 함수는 소켓을 닫기 전에 소켓을 종료합니다. 이 함수는 closesocket 소켓에서 느린 옵션을 사용하는 경우 정상 종료를 시도합니다.

함수가 closesocket 비차단 소켓을 정상적으로 종료하려고 하면 종료를 수행하는 작업자 스레드를 만들려고 시도합니다. 작업자 스레드는 통신 채널의 다른 쪽 끝에 소켓이 종료되고 있음을 알리려고 시도합니다. 채널의 다른 쪽 끝이 응답하지 않으면 작업자 스레드는 느린 시간 제한이 만료될 때까지 기다립니다. 그런 다음 중단 종료를 수행합니다.

위의 시나리오에서 느린 시간 제한이 0이면 작업자 스레드는 채널의 다른 쪽 끝이 응답할 때까지 무한 시간 동안 대기합니다. 이 스레드는 유용한 작업을 수행할 수 없으며 종료되지 않습니다. 그것은 유출되었습니다. 스레드와 연결된 메모리 및 종료하려는 소켓도 유출되었습니다.

해결 방법

모범 사례는 또는 WSASendDisconnect 함수를 사용하여 소켓을 명시적으로 종료한 shutdown 다음 함수를 호출하는 것입니다closesocket.

또는 느린 시간 제한 값을 0이 아닌 값(예: 1초)으로 설정할 수 있습니다. 작업자 스레드는 소켓을 종료하고 종료하기 전에 지정된 느린 시간 제한 값만 기다립니다.

추가 정보

closesocket 함수 및 작업자 스레드 함수는 .에서 afd.dll구현됩니다.

느린 시간에 대한 자세한 배경 정보는 정상 종료, 느린 옵션 및 소켓 클로저를 참조하세요.

 
 
Posted by gurupia
,