Hello,
My problem is that I've sent a pointer value. I needed to serialyze my String and Double types.
Remy Lebeau helped me on this.
For those interrested, here is the working code :
Client TCP code :
var
MultiCNData: TMultiCN;
function ReadString: String;
begin
Result := IdTCPClient1.IOHandler.ReadString(IdTCPClient1.IOHandler.ReadLongInt, encUTF8);
end;
function ReadDouble: Double;
var
Tmp: TIdBytes;
begin
IdTCPClient1.IOHandler.ReadBytes(Tmp, SizeOf(Double));
BytesToRaw(Tmp, Result, SizeOf(Double));
end;
procedure ReadMultiCN(var Data: TMultiCN);
begin
Data.Date := ReadDouble;
Data.Poste := ReadString;
Data.Pilote1 := ReadString;
Data.Pilote2 := ReadString;
Data.OrdreFrabication := ReadString;
Data.Evenement := ReadString;
Data.Piquage := ReadString;
Data.Point := ReadDouble;
Data.cadencemoyenne := ReadDouble;
Data.cadencemaxi := ReadDouble;
Data.longueur := ReadDouble;
end;
begin
IdTCPClient1.Connect;
try
IdTCPClient1.GetResponse(200);
IdTCPClient1.SendCmd('OPERATION', 100);
ReadMultiCN(MultiCNData);
mmLogs.Lines.Add('-----');
mmLogs.Lines.Add(DateTimeToStr(MultiCNData.Date));
mmLogs.Lines.Add(MultiCNData.Poste);
finally
IdTCPClient1.Disconnect;
if IdTCPClient1.IOHandler <> nil then
IdTCPClient1.IOHandler.InputBuffer.Clear;
end;
end;
TCP CMD Server code
var
MultiCNData: TMultiCN;
procedure SendString(const Value: String);
var
Tmp: TIdBytes;
begin
Tmp := ToBytes(Value, encUTF8);
ASender.Context.Connection.IOHandler.Write(Length(Tmp));
ASender.Context.Connection.IOHandler.Write(Tmp);
end;
procedure SendDouble(Value: Double);
begin
ASender.Context.Connection.IOHandler.Write(RawToBytes(Value, SizeOf(Double)));
end;
procedure SendMultiCN(const Data: TMultiCN);
begin
ASender.Context.Connection.IOHandler.WriteBufferOpen;
try
SendDouble(Data.Date);
SendString(Data.Poste);
SendString(Data.Pilote1);
SendString(Data.Pilote1);
SendString(Data.OrdreFrabication);
SendString(Data.Evenement);
SendString(Data.Piquage);
SendDouble(Data.Point);
SendDouble(Data.cadencemoyenne);
SendDouble(Data.cadencemaxi);
SendDouble(Data.longueur);
ASender.Context.Connection.IOHandler.WriteBufferClose;
except
ASender.Context.Connection.IOHandler.WriteBufferCancel;
raise;
end;
end;
begin
MultiCNData.Date := Now;
MultiCNData.Poste := 'PicPic6';
MultiCNData.Pilote1 := 'Pilote1';
MultiCNData.Pilote1 := 'Pilote2';
MultiCNData.OrdreFrabication := '012365';
MultiCNData.Evenement := 'Démarrage';
MultiCNData.Piquage := 'Fichier.cnc';
MultiCNData.Point := 2115;
MultiCNData.cadencemoyenne := 45.55;
MultiCNData.cadencemaxi := 78.1;
MultiCNData.longueur := 1.8;
ASender.Reply.SetReply(100, 'ready to send you data');
ASender.SendReply;
SendMultiCN(MultiCNData);
end;