当tcpclient和相对流已关闭时TcpClient.Connected = true的奇怪问题C#

时间:2013-08-28 14:16:45

标签: c# tcp client-server tcpclient tcplistener

假设您有2个应用程序,服务器和客户端。我在Visual Studio 2010的2个实例中同时调试它们。让我们说在客户端我打电话:

                _reader.Close(); //BinaryReader

                _writer.Close(); //BinaryWriter

                _ssl.Close();    //SslStream taken from _stream

                _stream.Close(); //NetworkStream from _client.GetStream();

                _client.Close(); //TcpClient

我已通过调试器检查了此代码是否已执行。 在此之后,我还会通过其他指令触发客户端应用程序的关闭,实际上Visual Studio退出调试模式并返回标准模式

在服务器应用程序中,由于连接实际上已关闭,因此挂起的_reader.Read()会失败,从而触发在try / catch中正确处理的异常。根据{{​​3}},这应该相应地更新TcpClient.Connected的值。

这不会发生:服务器中的另一个线程一直在检查_client.Connected,但它仍然是真的。

你应该注意:

1)如果我使用“停止”按钮关闭客户端,一切都无缝地工作,_client.Connected变为false

2)不知道这可能是相关的,但服务器侦听127.0.0.1并且客户端连接到127.0.0.1,因为我在一台PC上调试这两个应用程序

2 个答案:

答案 0 :(得分:1)

仅当您调用“写入”或“读取”时才会更新“已连接”属性。

答案 1 :(得分:0)

我不知道这是否会让任何人感兴趣,但我会告诉你我是如何解决这个问题的。由于TcpClient.Connected似乎不可靠,(在某些情况下,即使在对基础流的读取尝试失败后仍然如此),而不是从TcpClient.Connected检查连接状态,我使用bool“已断开连接” 。

这样的bool值由从这样的TcpClient(通过BinaryReader)监听的线程管理:

当读取失败时 - >这意味着连接已关闭 - >生成异常并由try / catch优雅地处理,其中:

try
{
   reader.Read();
}

catch
{
   disconnect = true;
}