IdTcp中WriteBuffer和ReadBuffer的取数问题
//声明的结构体
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;
var PackHead: PRecPackHead;
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;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;