En Delphi XE2 Tengo un tipo de registro con la siguiente estructura:enviar y recibir Secuencia con TidTCPClient y TidTCPServer en Delphi XE2
TMachinInfoRec = record
IPStr: string[15];
Username: string[50];
Computername: string[100];
SentTime: TDateTime;
HasCommand: integer;
ClientCommands: array[0..9] of TMachineCommand;
end;
defino una variable en su variable y TMemoryStream en el lado del cliente y enviar la corriente con el componente 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;
y y obtener información en el lado del servidor con 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;
embargo, una cadena que se muestra en este formato:?
MZ ......... .. yy, ....... @ ......... .........................., ....
¿Cómo puedo resolver este problema?
Al mover estructuras de registro entre los diferentes procesos o durante E/S, declaro el registro con el 'Directiva packed'. De lo contrario, podría haber problemas de alineación. No digo que este sea el caso aquí, pero puede ser un error potencial más adelante. –
No olvide restablecer la 'Posición' de la secuencia a 0 después de llamar a 'ReadStream()' y antes de llamar a 'Read() '. Alternativamente, use 'TIdMemoryBufferStream' en lugar de' TMemoryStream' para permitir que Indy lea/escriba sus variables de registro directamente. –