首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

IdTcp中WriteBuffer和ReadBuffer的取数有关问题

2012-08-15 
IdTcp中WriteBuffer和ReadBuffer的取数问题//声明的结构体Delphi(Pascal) codePRecPackHead ^TRecPackHe

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的代码写成同步的方法,就更好了

热点排行