Autor Beitrag
lord_stelzer
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 07.10.10 16:20 
Client:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
var
  SI : TServerInfo;
  Stream : TStream;
  Len : LongInt;
begin
Stream:=TMemoryStream.Create;                   //Stream erstellen
idTCPClient1.IOHandler.WriteLn('0');            // 0 = ServerInfo holen
idTCPClient1.IOHandler.ReadStream(Stream);      //Stream von Server holen
Stream.Position:=0;                             //Zeigerposition im Stream
Stream.Read(Len, SizeOf(Len));                  //Länge des Records
Stream.Read(SI, Len);                           //Record lesen
Memo1.Lines.Add(SI.SName);                      //Inhalt zum Test ins Memo schreiben
Stream.Free;                                    //Stream wieder freigeben
end;


Server:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    art:string;
    SI : TServerInfo;
    Len : LongInt;
    Stream : TStream;
begin
  art:=AContext.Connection.IOHandler.ReadLn;
  If art = '0' then  //ServerInfo
  Begin
    SI.SName:=Edit1.Text;                                //Record füllen
    Stream := TMemoryStream.Create;                      //Stream erstellen
    Len:=SizeOf(TServerInfo);                            //Länge des Records
    Stream.Write(Len, SizeOf(Len));                      //Länge in Record schreiben
    Stream.Write(SI, Len);                               //Record schreiben
    AContext.Connection.IOHandler.Write(Stream, 0, true);//Stream an Client Senden
    Stream.Free;                                         //Stream freigeben
  End;


Im Server-Programm funktioniert alles er bekommt die '0' = ServerInfo holen
und antwortet aber im Client bekomme ich eine EAccessViolation
lord_stelzer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 07.10.10 21:32 
Habe den Fehler mittlerweile selber gefunden ;)
Wenn ich den Record definiere muss ich dem string eine feste Länge verpassen da es ja sonst nur ein Verweis ist und nur dieser übertragen wird.

ausblenden Delphi-Quelltext
1:
2:
3:
TServerInfo = record
   SName : string[255];
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 08.10.10 03:22 
Besser ist aber den String selbst mit Länge direkt zu schreiben. Dann kannst du erstens auch längere Strings verschicken, zweitens werden kürzere Strings nicht mit Nullen aufgefüllt und drittens geht dann mit neueren Delphiversionen auch Unicode (ShortStrings können kein Unicode, von UTF-8 einmal abgesehen).

Wie geht das genau? So:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
Stream.Write(PChar(MyString)^, Length(MyString));
...
SetLength(MyString, MyLength);
Stream.Read(PChar(MyString)^, MyLength);
Wenn wie hier die Länge des gesamten Strings schon die des Streams ist, kannst du die direkt nutzen. Du kannst aber auch mehrere Strings und andere Daten der Reihe nach schreiben. Dann kannst du die Länge jedes Strings einfach davorschreiben und dann zuerst auslesen.