div*_*ges 5 tcp networkstream tcpclient unity-game-engine
我使用TcpClient和为游戏创建了一个简单的持久套接字连接NetworkStream。连接,发送消息和正常断开连接都没有问题(退出应用程序/服务器关闭/等)。
但是,在某些情况下,客户端无法检测到与服务器的断开连接时,我遇到了一些问题。我要测试的最简单方法是拔出wifi盒上的网络电缆,或将手机设置为飞行模式,但这是在游戏中发生的,否则应该是稳定的wifi。
仔细阅读NetworkStream等等的文档,它说检测到断开连接的唯一方法是尝试写入套接字。相当公平,除了,当我尝试时,写入通过就好像没有什么不对。我可以这样写多条消息,一切似乎都很好。只有当我重新插入电缆时,它才会断开连接(所有消息都已缓冲?)。
将TcpClient设置为NoDelay,Flush()无论如何每次写入后都会有一个被调用。
我尝试过的
NetworkStream-没有喜悦CanWrite,Connected等一切回归真实TcpClient.Client.Poll( 1000, SelectMode.SelectWrite ); -返回trueTcpClient.Client.Poll( 1000, SelectMode.SelectRead ) && TcpClient.Client.Available == 0 -返回trueTcpClient.Client.Receive(buffer, SocketFlags.Peek) == 0-连接时,阻塞约10-20s,然后返回true。当没有服务器时,永远阻塞(?)NetworkStream.Write() -不抛出错误NetworkStream.BeginWrite()-不会引发错误(即使在调用时也不会EndWrite())WriteTimeout-无效那我在这做错了吗?NetworkStream写入应断开连接的套接字时,是否有任何方法可以引发错误(如应有的错误)?
我对保持活动没有任何问题(默认情况下,服务器将通知客户端一段时间内未收到任何消息,并且客户端将发送心跳信号),但在几分钟内,根据NetworkStream一切笨拙的。
它是针对游戏的,因此理想情况下,检测应该足够快(因为用户仍然可以在游戏中移动,直到需要进行服务器调用为止,其中有些会阻塞UI,因此游戏似乎坏了)。
我正在使用Unity,所以它是.Net 2.0
就是把wifi盒子上的网线拔掉
这是一个很好的测试。如果您这样做,则不会通知远程方。它怎么可能发现呢?不可以。
当我尝试时,写入就通过了,就好像没有什么问题一样
写入可以(并且)被缓冲。他们最终进入了一个堵塞的洞……没有回复。检测到这一点的唯一方法是超时。
那么我在这里做错了什么吗?
您已经尝试了很多事情,但从根本上来说,如果没有回复告诉您,您就无法找出断开连接的情况。使用超时。