-2

我在 windows 中开发了一个带有 qt 的 tcp-server。大约有 10-20 个客户端连接服务器,服务器和客户端之间有数据传输。每个连接的客户端都有不同的线程。服务器发送一个数据包,如果收到 ACK,则等待对该数据包的回复,然后发送下一个数据包。如果没有回复,则超时。如果客户端在 2 分钟内没有发送答案,我的服务器会再次发送相同的数据包。

没有问题。(顺便说一下我的电脑windows7家庭高级版)当我将我的应用程序带到另一台装有windows7 Ultimate的电脑上时,如果超时,而不是再次发送相同的数据包,它什么也不做。我的电脑和这台电脑的另一个区别是,这台电脑没有安装qt。我使用所需的 dll 运行我的应用程序。

什么会导致这个问题?

提前致谢。

4

1 回答 1

1

首先是保持命名顺序:

  • IP发送数据包
  • TCP 发送
  • 一个套接字发送一个数据流。(概念不同于std::stream

IP 实现为设备驱动程序,TCP 实现为在其上播放的驱动程序,soket 是链接到应用程序(可能是静态或动态)的库,所有 QT 东西都是使用套接字发送数据的库。

将流分成段的角色属于套接字库,将段分成数据包,枚举它们,检查是否缺少某些内容并请求重传的角色属于 TCP。

您的代码不应该处理所有这些:它只需要发送和接收数据,并管理底层套接字在持续和不可恢复的 TCP 故障情况下可能报告的错误情况。

定义网络超时不是您的代码角色(有30 多年的完善和定义的标准:自己做其他事情只会让网络管理员的生活变得一团糟,并且不会为您的应用程序增加任何价值)

您的问题很可能是您的时间和“传输控制”与底层 TCP 协商时间之间的冲突(这取决于双方驱动程序中的 avaliale 缓冲区大小,并且可能不仅取决于操作系统,还取决于随着时间的推移,操作系统实际上在做什么),这使得两个控制系统以一种不稳定的方式进行改造。

于 2013-01-30T08:11:32.553 回答