【发布时间】:2019-08-26 13:45:48
【问题描述】:
我必须设置一个 tcp 服务来处理一些客户端请求
所有请求都以十六进制字符串数据包的形式出现,长度为 1099 字节,并且都以 00D0 开头并以 00000000 结尾
procedure TForm2.IdTCPServer1Execute(AContext: TIdContext);
begin
AContext.Connection.IOHandler.ReadBytes(data, 1099, False);
RStr:='';
for I := 0 to length(data)-1 do
RStr := RStr + chr(data[i]);
if(copy(RStr,1,4)='00D0') and (copy(RStr,1091,8)='00000000') then
begin
Memo14.Lines.Add( 'Frame added to database.' );
end
else
begin
Memo14.Lines.Add( 'error invalid Frame ...' );
end;
end;
服务器接收到 1099 字节的数据包,但只显示 error invalid Frame ...。
我的代码有什么问题!?
PS:客户端不断向服务器发送数据,我的意思是客户端从第三方接收数据并发送到服务器,因此它可能不是从数据包的第一个开始数据!所以我必须先丢弃一些数据才能到达数据包00D0!
【问题讨论】:
-
数据是十六进制格式的字符串吗?也许你的意思是
(RStr, 1, 2) = $00$D0? -
否,数据正在转换为字符串 (RStr, 1, 4) = '0D00'
-
设置断点并在调试器中查看
RStr与if行时会发生什么?前 4 个字符是您所期望的吗?最后 8 个呢? -
@KenWhite
0D00和00000000在输入字符串中,但一开始和结束时都没有。我必须删除一些数据才能到达00D0,然后每 1099 字节以 @ 开头987654332@ 并以00000000结尾... -
@roozgar 看,这些是您应该从一开始就提供的详细信息。它们会影响人们给你的答案类型
标签: delphi tcp indy tcplistener