|
연결되지 않는 서버에 지속적으로 연결을 시도하는 경우는 흔하지 않아 저도 몰랐는데...
TClientSocket의 버그인 듯 합니다. (참고로 델파이 6, 7에서도 똑같이 리소스가 새더군요)
VCL의 소켓 관련 소스를 보니 핸들 관리에 있어 의심스러운 부분이 있습니다.
어쨌든 증상을 정리하면...
TClientSocket을 넌블로킹 방식으로 오픈했을 때, 연결이 실패하면 총 핸들이 몇개씩 증가합니다.
블로킹 방식일 때는 관계가 없고, 넌블로킹에서만 발생합니다. 또, OnError 이벤트에서 ErrorCode = 0 코드를
넣지 않아 예외가 일어나는 경우에도 핸들은 누출되지 않습니다.
버그인 것은 거의 틀림없어보이지만, 몇가지로 시도해보니 해결책은 있습니다.
가장 먼저 생각해볼 수 있는 것은 블로킹 방식으로 바꾸는 것입니다. 하지만 이렇게 하려면 코드를 꽤 고쳐야
할 것이므로, 다른 해결책을 찾아봤습니다.
OnError 이벤트에서 다음 코드를 추가하세요.
ClientSocket1->Socket->Disconnect(ClientSocket1->Socket->SocketHandle);
이렇게 해두면 핸들 갯수가 계속 증가하지 않습니다.
OnError가 아니라 다음번 Open() 하기 직전에 위 코드를 추가해도 되긴 하지만, 이상하게 OnError에서 추가한
것보단 총 핸들 갯수가 몇개 정도 더 많더군요.
그럼...
김태우 님이 쓰신 글 :
: (여기서 말하는 "핸들"은 Ctrl+Alt+Delete를 누르면 나오는 작업관리자에서
: "프로세스"창에 나오는 핸들을 말합니다.)
:
: TClientSocket를 이용하여 프로그래밍을 하고 있습니다.
: 그런데 TClientSocket가 연결이 안되는 IP로 접속을 시도하고
: SocketError이벤트가 발생한 후, 타이머에 의해 다시 TClientSocket->Open()을 호출하면
: 핸들이 3정도씩 증가합니다.
:
: ErrorCode는 10060,10061로 오고, SocketErrorEvent에서는 다른것은 안해주고
: "ErrorCode=0"이라고만 적어주었습니다. 그 후에 타이머에 의해서 다시
: TClient->Open()을 호출하는데 여기서 핸들이 증가됩니다.
:
: 이게 하루정도 지나면 3000~4000개 정도로 증가되고, 결국은 죽어버립니다.
: 이거 왜이러는 거죠.
:
: 이것때문에 계속 욕먹고 있습니다. 아시는분은 좀 도와주세요~~~~~
:
: ***핸들이 증가된 모습을 캡춰하여 첨부하였으니 참고해 주시면 감사하겠습니다.
|