IdTcp中WriteBuffer和ReadBuffer的取数问题
//声明的结构体
- Delphi(Pascal) code
PRecPackHead = ^TRecPackHead; TRecPackHead = record PackLen : ShortInt; TransNum : array[0..4] of Char; ResultNum : array[0..6] of Char; ResultStr : array[0..40] of Char; end;
//PackHead定义
- Delphi(Pascal) code
var PackHead: PRecPackHead;
//写入数据
- Delphi(Pascal) code
procedure TfrmServer.tcpServerExecute(AThread: TIdPeerThread);var Client : TClientInfo; Str1, Str2, Msg : String;begin //读取客户传来的字符串 Msg := AThread.Connection.ReadLn; Client := Pointer(AThread.Data); if Client.Name = 'Logging In' then begin Client.Name := Msg; UpdateClients; BroadcastMessage('System', Msg + ' 连接到服务器.'); AThread.Connection.WriteLn(mmoServerInfo.Lines.Text); end else if Msg[1] = '@' then begin Msg := Copy(Msg, 2, Length(Msg) - 1); Str1 := Copy(Msg, 1, Pos('@', Msg) - 1); Str2 := Copy(Msg, Pos('@', Msg) + 1, Length(Msg) - Pos('@', Msg)); OperatorFlow(Str1, Str2); try AThread.Connection.WriteLn('@RESULT='+PackHead^.ResultNum); //这里写入的数据可以读取出来 AThread.Connection.WriteBuffer(PackHead, SizeOf(TRecPackHead)); //这里写入的数据读取不了 AThread.Connection.WriteLn('@AAAAA'); //这里写入的数据也能读取出去 finally FreeMem(PackHead); FreeMem(DataType); end; end;end;//读取数据
- Delphi(Pascal) code
procedure TRecvThread.Execute;var Com, Msg, ResultNum, AType: string;begin if not frmClient.IdTCPClient.Connected then begin Terminate; Exit; end; while (not Terminated) and frmClient.IdTCPClient.Connected do begin Msg := frmClient.IdTCPClient.ReadLn('', 5); if Msg <> '' then begin if Msg[1] <> '@' then begin frmClient.mmoMsg.Lines.Add(Msg); end else begin Com := UpperCase(Trim(Copy(Msg, 2, Pos('=', Msg) -2))); ResultNum := UpperCase(Trim(Copy(Msg, Pos('RESULT', Msg) +7, 4))); frmClient.mmoMsg.Lines.Add('Com='+Com+' Msg='+ResultNum); if ResultNum = '0000' then begin GetMem(PackHead, SizeOf(TRecPackHead)); frmClient.mmoMsg.Lines.Add(' Msg='+Msg); frmClient.IdTCPClient.ReadBuffer(PackHead^, SizeOf(TRecPackHead)); frmClient.mmoMsg.Lines.Add(PackHead^.ResultNum); frmClient.mmoMsg.Lines.Add(' Msg='+Msg); end; end; frmClient.mmoMsg.Lines.Add(frmClient.IdTCPClient.ReadLn()); end; end;end;在读取的过程中,ReadLn()能读取到数据,
frmClient.mmoMsg.Lines.Add(PackHead^.ResultNum);
读取出来的数据为空
请问是不是那里还需要设置一下。
[解决办法]
AThread.Connection.WriteBuffer(PackHead^, SizeOf(PackHead^), True);
GetMem(PackHead, SizeOf(PackHead^));
frmClient.IdTCPClient.ReadBuffer(PackHead^, SizeOf(PackHead^));
可以在创建接收数据的线程,初始化时给PackHead申请内存就行了,不用每次申请(你这里也没看到释放的,有溢出危险)
另外,把操作mmoMsg的代码写成同步的方法,就更好了