【发布时间】:2012-03-15 15:12:05
【问题描述】:
在 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..,........@........ ………………
我该如何解决这个问题?
【问题讨论】:
-
在不同进程之间或 I/O 期间移动记录结构时,请使用
packed指令声明记录。否则可能会出现对齐问题。我并不是说这里就是这种情况,但以后可能是一个潜在的错误。 -
不要忘记在调用
ReadStream()之后和调用Read()之前将流的Position重置为0。或者,使用TIdMemoryBufferStream而不是TMemoryStream让 Indy 直接读取/写入您的记录变量。
标签: delphi delphi-xe2 indy