【问题标题】:TCP server differences in operating systems [closed]操作系统中的 TCP 服务器差异 [关闭]
【发布时间】:2013-01-31 05:10:45
【问题描述】:

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

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

什么会导致这个问题?

提前致谢。

【问题讨论】:

  • 它在另一台计算机上是否有效?如果不是,这可能是防火墙配置的问题...
  • 为什么要重新实现 TCP?它已经完成了所有这些。
  • 您的代码中可能存在导致未定义或实现定义的行为的错误 - 为什么不显示相关代码?另外,TCP 内置了重传逻辑——在同一个 TCP 连接上手动触发重发的整个想法是值得怀疑的。
  • “每个连接的客户端都有不同的线程” - 这是另一个坏主意,如果我理解你的意思是每个客户端有一个线程。这不能很好地扩展。
  • 我没有重新实现tcp。我使用 QTcpServer 来处理这些事情。但我有这个问题。 @Yahia我不认为这是防火墙配置,因为该过程开始了,它继续,但是在不同的状态下由于某种原因它停止了,什么也没发生。我有一个日志,但里面什么都没有。

标签: c++ qt tcp tcpclient


【解决方案1】:

首先要保持命名规则:

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

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

将stream-flow拆分为segment的作用属于socket库,将segment拆分为packet的作用属于TCP,枚举,检查是否丢失,请求重传。

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

定义网络超时不是你的代码角色(well established and defined standard 已经有 30 多年的历史了:你自己做其他事情只会让网络管理员的生活变得一团糟,并且对你的应用程序没有任何价值)

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

【讨论】:

  • 我明白谢谢,但让我用图片解释我的问题s9.postimage.org/xrvcr8q9r/Untitled.png
  • 但是如果问题不是传输丢失而是设备不理解数据我看不到重传的价值,那么你发送的内容有问题。
  • Sockets 不是库。 Sockets API 主要由系统调用组成。它不是图书馆。这一切都在内核中。
  • @EJP:除非您有办法将您的应用程序静态链接到“内核”,否则“内核 API”位​​于您必须链接的库中,以便您的语言可以具有合适的功能要调用的原型和代理将调用分派到内核中。另外,sin WINSOCK32.DLL 中的socket 库,与KERNEL32.DLL 不同。所以,再一次,这两个都是库,一个“内核”不再清楚它应该是什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2010-10-02
  • 1970-01-01
  • 2018-10-19
  • 2014-11-21
  • 1970-01-01
相关资源
最近更新 更多