gpt4 book ai didi

delphi - Indy TCPClient 和 InputBuffer 中的流氓字节

转载 作者:可可西里 更新时间:2023-11-01 02:32:06 26 4
gpt4 key购买 nike

我正在使用以下几行代码通过 IP 写入和读取外部调制解调器/路由器(又名设备)。

TCPClient.IOHandler.Write(MsgStr);
TCPClient.IOHandler.InputBuffer.Clear;
TCPClient.IOHandler.ReadBytes(Buffer, 10, True);

MsgStr 是一种字符串类型,其中包含我发送到我的设备的文本。缓冲区被声明为 TIdBytes。我可以确认 IOHandler.InputBufferIsEmpty 在调用 ReadBytes 之前立即返回 True。

我希望收到的前 10 个字节非常具体,因此从我的角度来看,我只对发送字符串后收到的前 10 个字节感兴趣。

我遇到的问题是,当与某些设备通信时,返回的第一个字节我在建立连接后第一次发送字符串将一个流氓(随机)字节放入我的缓冲区输出。后面的字节是正确的。

例如,我期望的 10 个字节可能是:#6A1EF1090#3 但我得到的是 .#6A1EF1090。在这个例子中,我在不应该有句号的地方加了一个句号。

如果我再次尝试发送,一切正常。 (即建立连接后发送的第二次写入)。奇怪的是(对我来说)使用套接字嗅探器不显示返回的随机字节。如果我创建自己的“服务器”来接收响应并发回某些内容,它在 100% 的时间内都可以正常工作。其他软件 - 即不是我的软件 - 与设备通信良好(但我当然不知道它们是如何解析数据的)。

上面是否有任何我做错的事情会导致这种情况 - 请记住,它只会在我建立连接后第一次使用 Write 时发生?

谢谢

编辑

我正在使用 Delphi 7 和 Indy 10.5.8

更新

好的。经过多次测试和查看,我离找到这个解决方案还差得很远。我有两个主要场景。 1 - 第一个字节丢失,2 - 在接收到的数据包开始时“引入”字节。使用 TIdLogEvent 和 TIdLogDebug 都显示丢失的字节或适当的初始引入字节。所以我上面的 ReadBytes 声明始终如一地展示了 Indy 认为存在的东西(在我看来)。

此外,为了进一步测试它,我下载并安装了 ICS 组件。不幸的是(或者幸运的是,这取决于你如何看待它)这并没有显示出与 Indy 相同的问题。这没有显示缺少第一个字节,也没有显示开头引入的字节。然而,我只进行了表面测试,但 Indy 会“非常直接地”产生行为,而 ICS 根本还没有产生。

如果有人感兴趣,我可以提供一个小型演示应用程序来说明问题和我连接到的 IP - 这是一个公共(public) IP,因此任何人都可以访问它。否则现在,我只需要解决它。我不愿意切换到 ICS,因为 ICS 在这种情况下可能工作正常,并且考虑到此套接字的使用几乎是程序的全部关键,必须用 ICS 完全替换 Indy 会很讨厌。

最佳答案

最后一个参数(True)

TCPClient.IOHandler.ReadBytes(Buffer, 10, True);

导致读取追加而不是替换缓冲区内容。

这需要首先正确设置缓冲区的大小和内容。

如果参数为 False,缓冲区内容将被替换为给定的字节数。

关于delphi - Indy TCPClient 和 InputBuffer 中的流氓字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com