Поток отправки и получения с TidTCPClient и TidTCPServer в Delphi XE2 - PullRequest
6 голосов
/ 25 февраля 2012

В Delphi XE2 у меня есть тип записи со следующей структурой:

  TMachinInfoRec = record
    IPStr: string[15];
    Username: string[50];
    Computername: string[100];
    SentTime: TDateTime;
    HasCommand: integer; 
    ClientCommands: array[0..9] of TMachineCommand;
  end;

Я определяю переменную для ее переменной и TMemoryStream на стороне клиента и отправляю поток с компонентом TidTCPClient:

var
  MIRec: TMachinInfoRec;
  msRecInfo: TMemoryStream;

begin
  MIRec.IPStr = '192.168.100.101';
  MIRec.Username := 'user-a';
  MIRec.Computername := 'Computer-a';
  MIRec.SentTime := Now();

  idTCPClient.Host := '192.168.100.138';
  idTCPClient.Port := 6000;

  idTCPClient.Connect;

  msRecInfo := TMemoryStream.Create;
  msRecInfo.Write(msRecInfo, SizeOf(Client));

  msRecInfo.Position := 0;
  idTCPClient.IOHandler.Write(msRecInfo);
end;

и получить информацию на стороне сервера с помощью TidTCPServer:

procedure TFrmMainServer.TCPServerExecute(AContext: TIdContext);
var
  MIRec: TMachinInfoRec;
  msRecInfo: TMemoryStream;
begin
  msRecInfo:= TMemoryStream.Create;

  AContext.Connection.IOHandler.ReadStream(msRecInfo, SizeOf(MIRec));

  msRecInfo.Read(msRecInfo, sizeOf(MIRec));

  ShowMessage(MIRec.IPStr);
  ShowMessage(MIRec.Computername)
end;

Но строка, которая отображается в этом формате:

MZ? ......... уу .., ....... @ ........................ ..........., ....

как я могу решить эту проблему?

1 Ответ

7 голосов
/ 25 февраля 2012

Не должно

     msRecInfo.Write(msRecInfo, SizeOf(Client));

быть

     msRecInfo.Write(miRec, SizeOf(miRec));

То же самое для чтения:

     msRecInfo.Read(miRec, sizeOf(MIRec));

Обратите внимание, что есть несколько других неопределенных факторов с этим кодом:

  • что такое "клиент"? OTOH, с вышеупомянутыми исправлениями, это устранено.
  • Мы не можем подтвердить из этого кода, что TMachineCommand не является указателем типа
...