Отправка и получение потока с TidTCPClient и TidTCPServer в Delphi XE2
в 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?.........yy..,.......@...................................,....
как я могу решить эту проблему?
1 ответов
не стоит
msRecInfo.Write(msRecInfo, SizeOf(Client));
быть
msRecInfo.Write(miRec, SizeOf(miRec));
то же самое для чтения:
msRecInfo.Read(miRec, sizeOf(MIRec));
обратите внимание, что есть несколько других неопределенных факторов с таким кодом:
- что такое "клиент"? OTOH, с вышеуказанными исправлениями, это исключено.
- мы не можем подтвердить из этого кода, что TMachineCommand не является типом указателя