2011-09-30 4 views
14

나는 the documentation on TcpClient.Close()을 읽고이 발견 해요 : 결국 관련 소켓의 마지막 발생합니다이 메소드를 호출NetworkStream과 TcpClient 또는 TcpClient를 모두 닫아야합니까?

을하며 보내고 하나가 생성 된 경우 데이터를 수신하는 데 사용되는 연관는 NetworkStream을 닫습니다. 내가 틀렸다면

그래서, 저를 해결하지만이 하나가 TcpClientClose()를 호출하는 경우 NetworkStream도 폐쇄됩니다 말한다.

그렇다면 코드 예제의 끝에 Close()이 모두 호출되는 이유는 무엇입니까?

networkStream.Close(); 
tcpClient.Close(); 

tcpClient.Close();으로 전화를 걸어도됩니까?

+1

예, 필요하지 않습니다. 이 예제에서 tcpClient.Close()를 사용하는 것은 필요하지 않습니다. 바로 다음에 프로그램이 종료됩니다. –

+3

.NET 3.0 이전에는 TcpClient와 기본 NetworkStream을 모두 명시 적으로 닫아야했습니다. .NET 3.0부터는 TcpClient를 닫을 때 기본 NetworkStream이 닫힙니다. TcpClient의 Close() 및 Dispose()는 일부 내부 로깅을 추가하는 Close()와 동등합니다. –

답변

9

아무도 대답을 수락하지 못했기 때문에이 질문에 응답하십시오.

Hans에 따르면 TcpClient.Close()가 기본 NetworkStream을 닫기 때문에 NetworkStream.Close()를 호출하지 않아도됩니다.

+2

이 답변은 잘못되었습니다. 비비안의 대답을보십시오. 거기에서 언급했듯이, [doc 용 GetStream] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx)에는 '네트워크 스트림을 닫아야 만한다. 데이터 송수신. TcpClient를 닫으면 NetworkStream이 해제되지 않습니다. ' – BitMask777

+4

그러나 [doc for Close] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx)는'호출 중 이 메소드는 최종적으로 관련된 Socket을 닫고, 생성 된 데이터를 송수신하는 데 사용되는 연관된 NetworkStream도 닫을 것입니다. 'GetStream 문서가 오래되었다고 의심해 - 그 이후 메모가있었습니다. NET 2.0 (여전히 문제가되었을 때). – Sam

-6

당신은 그냥해야한다 "TcpClient.Close()"
아니면, 입력해야하는 경우

2

는 NetworkStream 및하여 TcpClient 모두는 IDisposable을 구현합니다. 그래서 내 생각에 모범 사례는 그것을 사용하는 블록에 담아서 수동으로 닫거나 처리 할 필요가 없다는 것입니다.

1

클라이언트 닫기는 스트림을 닫지 않으며 GetStream 메서드의 문서에 있습니다. 참조 용으로이 토론을보십시오. How to properly and completely close/reset a TcpClient connection?

+0

[Sam이 여기에 쓰는대로] (http://stackoverflow.com/questions/7617127/does-one-need-to-close-both-networkstream-and-tcpclient-or-just-tcpclient#comment26031079_7623611) 그 메모는 구식입니다. 이전에는 필요했지만, .NET 3.0 이후에는 더 이상 존재하지 않습니다. – Stijn

관련 문제