【问题标题】:Delphi 7 & indy 9 Buffer Reader issue, Not reading all PacketsDelphi 7 & indy 9 Buffer Reader 问题,未读取所有数据包
【发布时间】:2014-05-15 17:54:30
【问题描述】:

我有一个连接到 Java Server 应用程序的 Delphi 应用程序(在 Delphi 7 中使用 indy 9 开发)。

通信在我们的暂存环境中运行良好。该问题发生在我们的生产环境中。

我做了一个 TCP 转储并能够跟踪所有数据包,所有数据都传递到运行 Delphi 应用程序的网络接口卡上。我们的 MTU 设置为默认值 1500

总数据包大小平均为 15kb。

当 delphi 应用程序读取缓冲区时,它只读取缓冲区上的前几个数据包,而不是完整的响应。

我能够在输出到从缓冲区读取的数据的文本文件时看到这一点。

升级到 indy 10 是不可能的,我们正在将所有应用程序迁移到 java 环境。

【问题讨论】:

  • 什么代码实际上是在接收数据包并构造要处理的消息?
  • 德尔福应用程序
  • @user3641972:这不是 EWit 所要求的。读取数据包并重建消息的应用程序代码是什么样的?请显示您使用 Indy 读取数据包的实际代码。另外,请显示实际的数据包本身,以验证您是否使用正确的代码来读取它们。
  • 你忽略了提问。
  • 没有看到你的实际代码,或者它试图实现的协议,我们只能推测为什么代码没有读取完整的数据包。我的猜测是你只是使用了错误的协议阅读代码,因此没有阅读你应该阅读的内容并使自己不同步。

标签: delphi sockets tcp indy-9


【解决方案1】:

我不知道 delphi/Indy-9。以下只是对 TCP 应用的一个观察。

在基于 TCP 的应用程序中,如果交换的数据没有应用程序级标记(开始和结束),通常遵循的一种方法是将数据长度编码为 2 或 4 个字节,并将这些字节添加到实际数据中。接收到此类数据的 TCP 应用程序应读取长度字节并继续读取,直到该多个字节到达,然后进一步处理。

在您的情况下 - 可能是接收应用程序将前几个字节解释为长度,但实际上不是。但是有效载荷。价值可能很高。所以应用程序没有进一步处理,因为它还没有收到它认为的那么多字节。

【讨论】:

  • 你说得对——协议失败。我现在要投票了,因为这也是我的猜测。
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多