gpt4 book ai didi

TcpClient/NetworkStream 未检测到断开连接

转载 作者:可可西里 更新时间:2023-11-01 02:32:08 27 4
gpt4 key购买 nike

我使用 TcpClientNetworkStream 为我们的游戏创建了一个简单的持久套接字连接。正常连接、发送消息和断开连接(退出应用程序/服务器关闭/等)都没有问题。

但是,我遇到了一些问题,在某些情况下,客户端没有检测到与服务器的断开连接。我对此进行测试的最简单方法是拔掉 wifi 盒上的网络电缆,或将手机设置为飞行模式,但它发生在游戏中,否则应该是稳定的 wifi。

通过 NetworkStream 等文档,它说检测断开连接的唯一方法是尝试写入套接字。很公平,除了,当我尝试时,写入通过,好像没有任何问题。我可以像这样写多条消息,一切似乎都很好。只有当我重新插入电缆时,它才会发现它已断开连接(所有消息都已缓冲?)。

TcpClient 设置为 NoDelay,而且每次写入后都会调用一个 Flush()

我尝试过的:

  • NetworkStream 写入消息 - 没有乐趣
  • CanWriteConnected等都返回true
  • TcpClient.Client.Poll( 1000, SelectMode.SelectWrite ); - 返回 true
  • TcpClient.Client.Poll( 1000, SelectMode.SelectRead ) && TcpClient.Client.Available == 0 - 返回 true
  • TcpClient.Client.Receive(buffer, SocketFlags.Peek) == 0 - 连接后,阻塞大约 10-20 秒,然后返回 true。当没有服务器时,永远阻塞(?)
  • NetworkStream.Write() - 不抛出错误
  • NetworkStream.BeginWrite() - 不抛出错误(甚至在调用 EndWrite() 时)
  • 设置 WriteTimeout - 没有效果
  • 有一个特定的时间我们没有收到来自服务器的消息(通常有一个保持事件状态) - 我有这个,但删除了它,因为我们得到了很多误报由于滞后等(一些客户会看到 10-20 秒的延迟)

那我是不是做错了什么?有什么方法可以让 NetworkStream 在写入应该断开连接的套接字时抛出错误(就像它应该的那样)?

我对 keep-alive 没问题(默认情况是服务器会通知客户端它有一段时间没有收到任何东西,客户端会发送心跳),但在这一刻,根据到 NetworkStream 一切都很好。

它用于游戏,因此理想情况下检测应该足够快(因为用户仍然可以在游戏中移动,直到他们需要进行服务器调用,其中一些会阻塞 UI,因此游戏看起来很糟糕)。

我使用的是 Unity,所以它是 .Net 2.0

最佳答案

is to pull out the network cable on the wifi box

这是一个很好的测试。如果您这样做,则不会通知远程方。它怎么可能发现?不能。

when I try, the write passes as if nothing is wrong

写入可以(并且正在)缓冲。他们最终进入了一个方 block 洞……没有回复。检测这种情况的唯一方法是超时。

So am I doing something wrong here?

您已经尝试了很多方法,但如果没有回复告诉您断开连接,您基本上无法找到断开连接。使用超时。

关于TcpClient/NetworkStream 未检测到断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31322716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com