加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:13:18 所属栏目:大数据 来源:网络整理
导读:我使用以下几行代码通过IP从外部调制解调器/路由器(也称为设备)进行写入和读取. TCPClient.IOHandler.Write(MsgStr);TCPClient.IOHandler.InputBuffer.Clear; TCPClient.IOHandler.ReadBytes(Buffer,10,True); MsgStr是一种字符串类型,其中包含我发送到设备
我使用以下几行代码通过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.在这个例子中,我有一个句号,不应该有一个.

如果我再次尝试发送,它工作正常. (即在建立连接后发送的第二个写入).奇怪(对我来说)使用Socket Sniffer并不会显示返回的随机字节.如果我创建自己的“服务器”来接收响应并发回一些东西,它可以100%正常工作.其他软件 – 也就是说,不是我的软件 – 与设备进行良好的通信(当然我不知道他们是如何解析数据的).

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

谢谢

编辑

我正在使用Delphi 7和Indy 10.5.8

UPDATE

好.经过多次测试和观察后,我无法找到这个解决方案.我有两个主要方案. 1 – 第一个字节丢失,2 – 在接收数据包开始时“引入”字节.使用TIdLogEvent和TIdLogDebug都会根据需要显示丢失的字节或初始引入的字节.所以我上面的ReadBytes声明一直在显示Indy认为的内容(在我看来).

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

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

解决方法

最后一个参数(True)
TCPClient.IOHandler.ReadBytes(Buffer,True);

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读