0

假设您有 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 中正确处理。这一点,根据TcpClient.Connected Remarks应该相应地更新 TcpClient.Connected 的值。

这不会发生:服务器中的另一个线程不断检查 _client.Connected 但它仍然是正确的。

你应该注意:

1)如果我使用“停止”按钮关闭客户端,一切正常,_client.Connected 变为 false

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

4

2 回答 2

1

仅当您调用 Write 或 Read 时,才会更新 Connected 属性。

于 2013-09-26T10:24:22.840 回答
0

我不知道这是否会引起任何人的兴趣,但我会告诉你我是如何解决这个问题的。由于 TcpClient.Connected 似乎不可靠,(在某些情况下,即使在对底层流的读取尝试失败后它仍然是正确的)而不是检查来自 TcpClient.Connected 的连接状态,我使用布尔“断开连接” .

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

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

try
{
   reader.Read();
}

catch
{
   disconnect = true;
}
于 2013-08-31T19:12:24.793 回答