2012-02-25 9 views
6

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?

+1

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. –

+6

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. –

Respuesta

7

no

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

En caso de ser

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

mismo de analisis:

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

Tenga en cuenta que hay varios otros factores inciertos con este código:

  • ¿Qué es "cliente"? OTOH, con las correcciones anteriores, esto se elimina.
  • no podemos confirmar de este código que TMachineCommand no es un tipo de puntero
Cuestiones relacionadas