2016-09-17 8 views
1

다음과 같은 베어 본 코드가 데이터를 보내거나 받으면 클라이언트의 연결이 끊어집니다.NetworkStream을 처리하면 클라이언트 연결이 끊어지는 이유

사용하는 블록이 생성하는 개체, 즉 NetworkStream 개체를 처분한다는 것은 제 것이 이해하지만 TcpClient 소켓은 왜 연결 해제합니까? 이 중요한 경우

콘솔 출력은 ... 진정한 은 거짓 여기

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Title = "Client"; 

      Process p = Process.Start(@"C:\Users\Teddy\Documents\visual studio 2015\code\TesyingNetworkStream\Server\bin\Debug\server.exe"); 
      Thread.Sleep(1000); 

      IPEndPoint EP = new IPEndPoint(
        IPAddress.Parse("192.168.1.10"), 4000 
        ); 

      TcpClient cli = new TcpClient(); 
      cli.Connect(EP); 

      UseClient(cli); 

      Console.ReadLine(); 
      p.Kill(); 
      p.Close(); 
     } 

     private static void UseClient(TcpClient cli) 
     { 
      using (NetworkStream ns = cli.GetStream()) 
      { 
       Console.WriteLine(cli.Connected);//True 
      } 
      Console.WriteLine(cli.Connected);//False 
     } 
    } 

서버 코드입니다.

class Program2 
    { 
     static void Main(string[] args) 
     { 
      Console.Title = "Server"; 

      TcpListener lis = new TcpListener(
       new IPEndPoint(
        IPAddress.Any, 4000 
        )); 

      lis.Start(); 

      lis.AcceptTcpClient(); 

      while (true) 
      { 
       Thread.Sleep(10); 
      } 
     } 
    } 

답변

3

여기 (.NET framework source에서)를 GetStream() 기능을 구현합니다. 이것은 ownsSocket 매개 변수입니다. MSDN에서 :

ownsSocket 파라미터의 값 true 경우는 NetworkStream 는 하부 소켓의 소유권 및 Close 방법도 는 하부 소켓 호출을 종료했습니다.

NetworkStreamDispose 구현 Close의 다음 소켓을 닫 스트림.

1

그것은 cli.GetStream(); 새로운 스트림에게 당신이 그것을 호출 할 때마다 생성하지 않기 때문에, 연결 및 cli.GetStream(); 반환 같은 스트림 객체에 대한 모든 호출에 대해 하나의 스트림이있다. 완료된 TcpClient에 신호를 보내는 해당 공유 스트림을 처리하면 TcpClient 연결이 끊어졌습니다.

public NetworkStream GetStream() { 
    if (m_CleanedUp){ 
     throw new ObjectDisposedException(this.GetType().FullName); 
    } 
    if (!Client.Connected) { 
     throw new InvalidOperationException(SR.GetString(SR.net_notconnected)); 
    } 
    if (m_DataStream == null) { 
     m_DataStream = new NetworkStream(Client, true); 
    } 
    return m_DataStream; 
} 

참고 NetworkStream 생성자에 대한 호출에 true :