Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi XE2中使用TidTCPClient和TidTCPServer发送和接收流_Delphi_Delphi Xe2_Indy - Fatal编程技术网

在Delphi XE2中使用TidTCPClient和TidTCPServer发送和接收流

在Delphi XE2中使用TidTCPClient和TidTCPServer发送和接收流,delphi,delphi-xe2,indy,Delphi,Delphi Xe2,Indy,在Delphi XE2中,我有一个具有以下结构的记录类型: TMachinInfoRec = record IPStr: string[15]; Username: string[50]; Computername: string[100]; SentTime: TDateTime; HasCommand: integer; ClientCommands: array[0..9] of TMachineCommand; end; 我在其

在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………@

我怎样才能解决这个问题?

不应该

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

相同,如下所示:

     msRecInfo.Read(miRec, sizeOf(MIRec));
请注意,此代码还有其他几个不确定因素:

  • 什么是“客户”?OTOH,通过上述修正,这是消除的
  • 我们无法从这段代码确认TMachineCommand不是指针类型

在不同进程之间或在I/O期间移动记录结构时,使用
packed
指令声明记录。否则可能会出现对齐问题。我不是说这里是这种情况,但以后可能会出现潜在错误。在调用
ReadStream()
之后和调用
Read()
之前,不要忘记将流的
位置
重置为0。或者,使用
TIdMemoryBufferStream
而不是
TMemoryStream
让Indy直接读取/写入记录变量。
     msRecInfo.Read(miRec, sizeOf(MIRec));