- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用以下几行代码通过 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/
我尝试使用SHA-256加密功能,但没有成功。 我需要获取字符串和文件的哈希值。我使用 Delphi 10.1 Berlin 和 Indy for Hash。 我的代码: uses System.Cl
是否有关于如何在 Lazarus 中安装 Indy 10 组件的分步指南? 我在 https://svn.atozed.com:444/svn/Indy10 查看了最后一个 snv 快照 用户名:In
我在 Delphi 7 中编写了一个程序(包括一个使用 Indy 的 ModBus 组件)。在我的机器上,它使用 Indy 9 并且工作正常。它通过 ModBus 协议(protocol)与其他机器进
我是 indy 新手,使用 CBuilder XE4 附带的任何版本。这是非常简单的代码,在我正在阅读的内容超过 16K 限制之前都可以正常工作...... String Ttcp_mgr::send
我在 4 个基于 ubuntu 的机器上设置了 4 个节点。我使用以下命令生成了这些节点所需的 key :init_indy_node VAL1 0.0.0.0 9701 0.0.0.0 9702 1
当前应用程序:Delphi 2006、indy9(大量使用 SOAP 和其他组件) 需要转到 Indy 10 以获得 TLS 支持(poodle 等)。 看着 http://www.indyproje
我是 C++ Builder 的新手。三天前,我安装了 Embarcadero®。 C++Builder® 2010。这门语言对我来说非常有趣。 在 Delphi 中,我通常使用 Indy 9 和 1
我对 SSL 和这些加密的东西完全陌生,但我需要让在移动设备上运行的客户端和服务器 Delphi XE6 应用程序进行通信。必须对 TCP 通信进行安全加密。 首先,我简单地编写了基于 Win32 客
我有三个问题: 是否可以通过多个连接破坏IdTCPServer? 我尝试测试我的应用程序,并且当我有多个连接时 - 它工作得很好(甚至几天),但是当有时连接数增加时,应用程序会导致访问冲突。我写的应用
我使用 Delphi XE 5/6,默认 Indy 版本,Windows 7。IdMappedPortTCP(放在表单上的组件)将本地流从 FFmpeg 重定向到 Twitch.tv,并且总是接近 2
我有一个客户端应用程序,它应该向可选的服务器应用程序发送通知消息。客户端不应受到服务器应用程序是否存在的影响。它应该尝试连接到服务器应用程序并发送通知消息,如果出现错误,它应该默默地忽略所有错误并继续
我在使用Indy(idTCPServer组件)读取客户端发送的数据时遇到一些问题,数据本身是十六进制格式的,所以我不能使用AThread.Connection.ReadLn( );为此... 这是我的
当Indy收到404时,我无法获取响应内容,它总是空的。 例如使用Indy访问https://www.etsy.com/people/car ,我收到 404 并且内容流(或分配的流)只是空的。对TH
很久以前,我使用 Delphi 2007 和 WebBroker (TWebModule) 启动了一些“Web 应用程序”。当时我假设您需要一个 Web 服务器(例如 Apache 或 Microso
这是我的程序: Application.FTP.Host:= vHost; Application.FTP.Port:= vPort; try Application.FTP.AutoLogin
以下代码请求 OAuth2 token 。它适用于 Indy 10.0.52,但对于 Indy 10 SVN 5412,由于请求凭据无效,它会生成 400 Bad Request 错误。 WXYZUs
我有一个应用程序需要从网络驱动器进行一些 FTP 上传。我为此使用 Indy。然后,当文件位于网络驱动器上并成功上传到 FTP 服务器时,我想通过电子邮件将同一文件发送给同事。 我正在使用下面的代码来
我正在使用 Indy UDP Server 读取一串数据。但是,我真的不知道如何使用 Adata 参数。我可以通过使用下面的 ByteToBin 函数将其转换为二进制,然后使用 BintoHex1 将
我是独立服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;它的大小始终为 128 字节。然后,当有人打开服务器主页时,文件会自动发送。所以: 在磁盘上上传一个文件(
我正在使用 Delphi 10.0 西雅图。 我想向 UDP 服务器发送请求,然后读取服务器响应,这是一个简单的字符串: Client side:send('12345') server side(o
我是一名优秀的程序员,十分优秀!