LNet Datenempfang ohne Ereigniss

Alle Fragen zur Netzwerkkommunikation
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

LNet Datenempfang ohne Ereigniss

Beitrag von DL3AD »

Hallo,

ich benutze mit LNet eine TCP Verbindung zum senden von Strings auf einen Port.
Nun muss ich aber die Daten sequentiel bearbeiten - d.h. ich sende einen String und möchte ihn dann selbst die Antwort abholen
und nicht dass OnRecaive Ereigniss nutzen.
Wie kann man den Empfangsbuffer auslesen ?

Gruß Frank

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: LNet Datenempfang ohne Ereigniss

Beitrag von corpsman »

In dem du eine Klasse um die TCP Lnet klasse drumrum baust.

Diese Klasse muss Lnet das OnReceive zur verfügung stellen und kann dann deine Daten Cachen, so dass du sie über einen anderen Get-er abhohlen kannst.
--
Just try it

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: LNet Datenempfang ohne Ereigniss

Beitrag von DL3AD »

Hallo corpsman,

Danke für den Hinweis - habe nun statt LNet das Synapse Paket verwendet.
Synapse bietet ja zu meinem Erstaunen :shock: wesentlich mehr Möglichkeiten und ist genauso einfach in der Handhabung.
Ein erster Test sah vielversprechend aus.

Gruß Frank

grl
Beiträge: 36
Registriert: Fr 17. Okt 2008, 19:24
OS, Lazarus, FPC: Debian X64, Lazarus 1.1, FPC 2.7.1
CPU-Target: x86, ARM

Re: LNet Datenempfang ohne Ereigniss

Beitrag von grl »

Hallo Frank!

Synapse ist extrem leistungsfähig - es empfiehlt sich, regelmässig akutelle Versionen zu checken (am besten aus dem SVN) und bei Problemen vor allem die mitgelieferten Beispielcodes anzusehen - damit wird schnell klar, wie das Paket aufgebaut ist.

73
GRL

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: LNet Datenempfang ohne Ereigniss

Beitrag von DL3AD »

Hallo grl,

ja, da hast du recht.
Synapse läuft auch sauber mit der 1.20 er Version von Lazarus - mit LNet hatte ich da auch einige Probleme.

Gruß Frank

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: LNet Datenempfang ohne Ereigniss

Beitrag von corpsman »

Hatte heute erst wieder e-mail kontakt mit dem Lnet Entwickler und nen Patch eingefügt. Geht also auch wunderbar. Bei Synapse nutze ich nur Synaser. ;)
--
Just try it

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: LNet Datenempfang ohne Ereigniss

Beitrag von DL3AD »

... was wurde denn gepatcht ?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: LNet Datenempfang ohne Ereigniss

Beitrag von corpsman »

Noch ists nicht im Trunk, aber wenns drin ist, dann kann man mittels

Code: Alles auswählen

 
  { TMyLFTPClient }
 
  TMyLFTPClient = Class(TLFTPClient) // Enable File Sending by Stream
  private
  public
    Function Put(Const Stream: Tstream; Filename: String): Boolean;
  End;
 
Function TMyLFTPClient.Put(Const Stream: Tstream; Filename: String): Boolean;
Const
  FLE = #13#10;
 
  Function MakeStatusRec(Const aStatus: TLFTPStatus; Const Arg1, Arg2: String): TLFTPStatusRec;
  Begin
    Result.Status := aStatus;
    Result.Args[1] := Arg1;
    Result.Args[2] := Arg2;
  End;
 
Begin
  Result := Not FPipeLine;
  //  if FileExists(FileName) and
  If CanContinue(fsStor, FileName, '') Then Begin
    //    FStoreFile := TFileStream.Create(FileName, fmOpenRead);
    FStoreFile := TMemoryStream.Create; // If you get here a type error, you have to edit lftp.pas and change to Tstream !!
    FStoreFile.CopyFrom(stream, stream.Size);
    FStoreFile.Position := 0;
    PasvPort;
    FStatus.Insert(MakeStatusRec(fsStor, '', ''));
    FControl.SendMessage('STOR ' + ExtractFileName(FileName) + FLE);
    Result := True;
  End;
End;
 
 


Nen FTP Client zum Upload aus dem Arbeitsspeicher kriegen ;)
--
Just try it

Antworten