2016-09-17 68 views
1

次のベアボーンコードがデータを送受信しているとき、クライアントは切断されます。NetworkStreamを廃棄するとクライアントが切断される理由

私は、使用しているブロックが作成するオブジェクト、つまりNetworkStreamオブジェクトを破棄したが、なぜTcpClientソケットが切断されるのか理解していたのですが?それが重要な場合

コンソール出力がある... 真 はFalseをここ

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メソッドを呼び出すと、 根底にあるソケットを閉じます。その後、ソケットを閉じ

NetworkStreamさんDispose実装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

関連する問題