2010-02-18 4 views
0

나는 단순한 tcp 기반의 "에코 프로토콜"을 만들었고 클라이언트가 강제로 연결을 닫을 때 서버에서 핸들 누수가 발생한다는 것을 알아 차렸다.소켓이 원격 호스트에 의해 강제로 닫히면 핸들 누출이 발생합니까? (.net)

소켓을 닫을 때와 같은 방법으로 socketReset을 잡아서 처리합니다 (socket.Shutdown 및 socket.close). 아무도 그런 문제를 겪었나요? 소켓을 수행하는 동안 ConnectionReset 예외가 발생합니다. 중요하다면 읽습니다.

감사합니다.

편집 : Microsoft의 DebugDiag 도구는 MSCORLIB에서 만든 이벤트 처리기를 제안합니다. 말할 필요도없이 직접 만들지는 않겠지 만 (.net 라이브러리에 의해 어딘가에 만들어 짐)

답변

1

Socket.Recieve 및 Socket.Write는 불행하게도 다른 쪽 끝이 소켓을 닫을 때 감지 할 수있는 유일한 장소입니다 강제로 오히려 올바르게.

Socket.Close() (내 인텔리 전스에 따라) 소켓 핸들을 해제해야합니다.

먼저 Socket.Close()이 실제로 호출되고 있는지 확인하십시오. 그런 다음 다른 곳에서 핸들 누수가 있는지 확인하십시오. 처분이 필요하지 않은 물체를 사용하고 있습니까? 예 : FileStream?

+0

정말 부름을 받았습니다. 파일 스트림은 없지만 어쨌든 리셋 소켓을 멋지게 닫힌 소켓으로 취급합니다. (그리고 나는 Read를 수행하는 동안 예외를 얻는다) – r0u1i

-1

나는 당신이 바로 그것을 할 생각 :

Socket.Close 소켓에 관련된 모든 관리 및 관리되지 않는 능숙를 확보해야한다.

그러나 당신은 또한

GC.Collect(); 

수동으로 가비지 콜렉터를 실행하는 데 사용 (그 이후) 어쩌면

socket = null; 

그리고 설정하려고 않았고, 여전히 누출이 후 존재?

다른 아이디어 : 핸들 누출을 어떻게 모니터링합니까? OS가 장시간 (분) 동안 메모리에 닫힌 TCP 연결을 유지할 수 있습니다. 이는 정상적인 동작입니다.

+0

예, 나는 그것들 모두를하고있다. 그리고 누출은 여전히 ​​존재한다. 작업 관리자에서 핸들 누수가 표시되지만 net stat를 실행하면 인접 대기 연결이 없음을 보여줍니다. Microsoft의 DebugDiag 도구는 해당 핸들이 이벤트 핸들임을 제안합니다. 이것이 내가 가진 유일한 단서입니다. – r0u1i

+1

좋아요, 수락 TcpListener 개체를 파기 한 후에도 누출이 있습니까? – Tarnschaf

+0

아니요, 아니에요 (나는 처음에는 그렇게 생각했지만 오해했습니다). 그게 우리에게 무엇을 말합니까? 결국, 나는 청취자를 수시로 막을 수 없다. – r0u1i

관련 문제