tcp客户端无法统一随机连接到本地服务器

tcp client can't connect to local server randomly in unity

我有一个 unity3d 客户端使用 BeginConnect 连接我的本地服务器,但无法建立连接 运行domly,尤其是在我重新启动后统一编辑器。一旦连接上,即使我重新启动游戏(不是编辑器)多次也会变得很正常。

wireshark 显示问题发生时没有发送任何内容。

我有另一个非常相似的客户端,但它可以非常完美地连接到我的另一个相似的本地服务器。

知道导致问题的原因吗?

提前致谢。

===

PS。

  1. 即使使用重试机制,客户端也可以成功连接到服务器,但后来的异步操作(BeginSendBeginReceive)可能仍然 运行 经常停止工作。
  2. 即使我 运行 客户端没有运行服务器,连接也可能没有响应。
  3. 我在 OnApplicationQuit() 函数中有关闭套接字的代码:

    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
    
  4. 另一个类似的客户端具有几乎相同的代码库,但运行良好。
  5. 我发现了另一个类似的问题:http://answers.unity3d.com/questions/925955/socketbeginwrite-no-response-in-463f1.html?sort=oldest。但它无法解释为什么我的另一个客户端(相同版本的 unity)有效。

我们的大多数 TCP 相关问题都与未能关闭侦听器线程或未能与服务器断开连接有关。

当您在编辑器环境中创建线程时,只要编辑器运行,线程就会继续存在,即使您停止游戏。如果以多线程方式使用TCP,则必须在某些OnDestroy或OnDisable方法中手动停止线程。

还请确保在停止游戏时断开与服务器的连接。

如果这些还不足以解决您的问题,如果您可以分享一些导致此问题的示例代码,我可能会提供帮助。

据此http://answers.unity3d.com/questions/925955/socketbeginwrite-no-response-in-463f1.html?sort=oldest,似乎在unity3d v4.6.3f1中,mono runtime在BeginXXX系列函数的实现上存在一些bug。

unity 团队可能会在较新的版本中修复这些错误(未测试),但我仍然需要留在 v4.6.3f1,所以解决方法是 用 XXXAsync 系列替换 BeginXXX. (经过测试并适用于我的问题)