我正在使用以下几行代码通过IP与外部调制解调器/路由器(也称为设备)进行读写。
TCPClient.IOHandler.Write(MsgStr);
TCPClient.IOHandler.InputBuffer.Clear;
TCPClient.IOHandler.ReadBytes(Buffer, 10, True);
MsgStr 是一个字符串类型,它包含了我要发送到我的设备的文本。 Buffer 被声明为 TIdBytes 类型。 在调用 ReadBytes 之前,我可以确认 IOHandler.InputBufferIsEmpty 立即返回 True。
我期望接收到的前 10 个字节非常具体,因此从我的角度来看,我只对发送字符串后接收到的前 10 个字节感兴趣。
问题是,当与某些设备通信时,第一次发送字符串并建立连接后返回的第一个字节会将一个“错误”(随机)的字节放入我的 Buffer 输出中。随后的字节是正确的。
例如,我期望的 10 个字节可能是:#6A1EF1090#3,但我得到的是.#6A1EF1090。在这个例子中,我有一个不应该出现的句号。
如果我再次尝试发送,就可以正常工作。(也就是在建立连接后发送的第二个写操作)。奇怪的是(对我来说),使用 Socket Sniffer 并没有显示返回的随机字节。如果我创建自己的“服务器”来接收响应并发送回来,它始终可以正常运行。其他软件——也就是不是我编写的软件——可以正常与设备通信(但我当然不知道它们是如何解析数据的)。
在上面的内容中,是否存在任何可能导致此情况发生的错误?请注意,这仅在建立连接后第一次使用 Write 时发生。
谢谢
编辑
我正在使用 Delphi 7 和 Indy 10.5.8
更新
好的。经过多次测试和查看,我离找到解决方法还很远。我得到了两种主要情况:1 - 第一个字节丢失;2 - 接收到的数据包开头出现了“错误”字节。使用 TIdLogEvent 和 TIdLogDebug 都可以显示相应地缺失或初始引入的字节。因此,我认为我的 ReadBytes 语句始终能够准确地显示 Indy 认为存在的内容。
此外,为了进一步测试它,我下载并安装了 ICS 组件。不幸的是(或者幸运,取决于你的角度),ICS 没有显示与 Indy 相同的问题。它没有显示首字节丢失,也没有显示在开始时引入的字节。然而,我只做了初步的测试,但 Indy 的行为“几乎立即”就会产生,而 ICS 还没有产生。
如果有人感兴趣,我可以提供一个小型演示应用程序,以说明此问题和我连接的 IP——它是公共 IP,任何人都可以访问它。否则,现在我只能绕过它。我不想切换到 ICS,因为 ICS 在这种情况下可能运行良好,考虑到这个 socket 的使用几乎是整个程序的关键,完全用 ICS 替换 Indy 将是很麻烦的。