使用Indy收到奇怪的罕见无序数据

时间:2010-03-14 02:02:25

标签: delphi delphi-2007 indy indy10

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

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

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

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

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

有没有人有任何好主意?

4 个答案:

答案 0 :(得分:4)

您可以尝试Wireshark了解如何传输数据。这样您就可以了解问题是在服务器中还是在客户端中。还记得使用TCP以正确的顺序获得“保证”的有效数据。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您是否检查了IOHandler的Nagle设置?我们遇到了类似的问题,我们通过将UseNagle设置为false来修复。在我们的情况下,由于Nagle合并,发送和接收大量数据的速度很慢,所以它与你的情况并不完全相同。