0

我们在 Indy10 中遇到了一个奇怪的问题,我们使用 TCP 一个接一个地发送的两个大字符串(每个几百个字符)在另一端奇怪地交织在一起。这种情况极少发生。

每个字符串都是以 LF 结尾的完整 XML 消息,通常 READ 进程读取整个 XML 消息,并在看到 LF 时返回。

实际发送消息的调用受到对 IOHandler 的 writeln 方法调用的关键部分的保护,因此两个线程不可能同时发送。(我们确定关键部分已实现/正常工作)。这个问题很少发生。症状很奇怪......当我们发送字符串 A 后跟字符串 B 时,我们在另一端收到的(在我们遇到故障的极少数情况下)是字符串 A 本身的尾随部分(, 末尾有一个 LF),然后是字符串 A 的前导部分,然后是整个字符串 B,然后是一个 LF。我们已经验证在部分读取后“超时”属性不正确 - 我们在每次读取返回内容后记录该属性。此外,我们知道字符串中没有嵌入的 LF 字符,因为我们在附加 LF 并发送它之前用空格显式替换字符串中的所有非字母数字字符。

我们在传输端和接收端的关键部分都有日志机制,因此我们可以在“线路”处看到这种行为。

我们完全困惑并想知道(尽管总是最低可能性)是否可能存在一些可能导致此问题的低级 Indy 问题,例如,缓冲区以错误的顺序发送......很难相信这可能是这个问题,但我们正在抓住稻草。

有没有人有什么好主意?

4

4 回答 4

4

您可以尝试使用Wireshark来了解数据是如何传输的。通过这种方式,您可以找出问题出在服务器还是客户端。还要记住使用 TCP 以正确的顺序获取“保证”的有效数据。

于 2010-03-14T07:29:29.187 回答
3

您使用的是 TCP 还是 UDP?如果您使用的是 UDP,由于网络中的路由,可能(并且预期)UDP 数据包的接收顺序与传输顺序不同。如果是这种情况,您需要为每个 UDP 数据包添加某种数据包 ID,以便接收器可以正确地对数据包进行排序。

于 2010-03-14T07:25:32.437 回答
2

您是否有多个线程在接收端同时从同一个套接字读取?即使只是查询 Connected() 状态也会导致读取发生。如果您不小心,这可能会导致您的多个线程读取入站数据并将其以随机顺序存储到 IOHandler.InputBuffer 中。

于 2010-08-02T21:12:14.357 回答
2

你检查过 IOHandler 的Nagle设置了吗?我们有一个类似的问题,我们通过将 UseNagle 设置为 false 来解决。在我们的案例中,由于 Nagle 合并,突发发送和接收大量数据的速度很慢,因此与您的情况不太一样。

于 2010-08-03T05:02:04.473 回答