网络套接字上的C#BinaryReader.ReadString

时间:2011-10-06 22:42:53

标签: c# binaryreader

我有一个服务器/客户端应用程序。

通信时都使用BinaryReader / Writer。

当客户端和服务器快速交换消息时,许多在给定的时间内,并且我关闭服务器(通过内置命令,有序关闭)大部分时间(但不总是)客户端的BinaryReader.ReadString()抛出EndOfStreamException,这很好。我不明白的是为什么这个异常不会将TcpClient.Connected属性更改为'false'?

while(true){
   try{
      BinaryReader.ReadString()
   }
   catch(IOException){
     if(!TcpClient.Connected)
        break;
     //BinaryWriter.Write() - this will, eventually, change Connected property to 'false'
   }
}

这将无休止地循环。我认为Connected属性会在不成功的网络读/写时发生变化。如果BinaryReader抛出异常然后它没有成功读取,是吗?

如果我输入BinaryWriter.Write(),则无限循环被破坏,因为Connected属性被更改为'false'。

相关问题,EndOfStreamException是否始终指示网络连接断开或者是否意味着临时问题?

1 个答案:

答案 0 :(得分:2)

按设计。来自MSDN Library文章的备注部分,用于TcpClient.Connected:

  

因为Connected属性仅反映了该状态   连接到最近的操作,你应该尝试发送   或接收消息以确定当前状态。消息后   发送失败,此属性不再返回true。请注意这一点   行为是设计的。你无法可靠地测试状态   连接因为,在测试和发送/接收之间的时间,   连接可能已丢失。你的代码应该假设   套接字已连接,并正常处理失败的传输

您发现的解决方法是正确的。