3

这可能是一个有点长的帖子

我有一个服务器和一个客户端,我有能力查看发送/接收消息并在两台机器上实时计算它们,这样我就不必在 VS2012 中进行调试,

我在加利福尼亚的另一台机器上运行我的服务器,以便服务器和客户端位于完全不同的 IP 上并通过互联网运行以进行实时测试,他们使用 DNS 名称并很好地解析它们。

两台物理 PC 都没有防病毒软件,也没有防火墙,并且 Windows 防火墙都已关闭。

两台机器都安装了wireshark来跟踪我在UDP端口29999上的数据包

该序列的工作原理是客户端发送登录,服务器通过一些凭据验证客户端,服务器发送玩家信息(统计信息)

第一次启动服务器可执行文件时,消息会毫无失败地传递给客户端。每次

如果您重新启动客户端并重试,则客户端不会收到消息。

1) server.exe 上的计数器正确递增,2) 服务器上的服务器 Wireshark 显示发送的消息 3) 客户端的 Wireshark 看到 UDP 数据包从正确的 IP 地址进入正确的端口

但 client.exe 消息计数器不会增加。

如果我在 VS2012 中以 DEBUG 模式运行客户端并设置断点,如下所示:

 while ((_NetworkIncomingMsg = _NetworkClient.ReadMessage()) != null)
                        {

                            ReadInTime = DateTime.Now; // <<-- break point here
                        // blah blah more code
}

它永远不会命中,也不会收到任何消息。

重要的是要注意,如果 i 是 while 语句上的断点,是的,它正在触发,但没有读取任何消息,因此它为空,因此跳过代码

我相信这与 ReadServerMessages() 方法的时间或位置有关。

我有 ReadServerMessages() 方法在 Timer 上触发,作为它经过的事件,如此处所示。计时器被构造为每 1.0 毫秒触发一次。因为这在软件的所有其他部分中几乎完美无缺,包括实际连接到专用服务器并不断发送数据包时。

public System.Timers.Timer ClientNetworkTick = new System.Timers.Timer(1.0);
 void update_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
                {
                    // Check if server sent new messages
                    try
                    {
                        ReadServerMessages();
                    }
                    catch (Exception ex)
                    {

                    }
                }

有什么想法吗?我遗漏的任何事情都告诉我谢谢!

4

0 回答 0