[erledigt] LNet einzelnen Server Socket schließen

Alle Fragen zur Netzwerkkommunikation
Antworten
NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

[erledigt] LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Hallo zusammen,
ich habe ein paar kleine Progrämmchen auf einem WinServer laufen.
Die machen mit LNet einen Serverport auf. Das funzt auch wunderbar, aber
unsere IT macht seit geraumer Zeit im Netzwerk einen Portscan und connected sich
überall drauf wo ein Port offen ist. was die damit bezwecken kann ich nur raten.
Jetzt hab ich mit 2 Dingen ein Problem.
Erstens bekomme ich irgendwelche Daten mit denen ich nix anfange
(ignorieren krieg ich aber sicherlich hin)
zweitens disconnecten die nicht sauber so daß immer der socket übrig bleibt.
Wenn ich jetzt Daten an die verschiedenen Clients sende bekomme ich bei diesen
kaputten sockets eine Fehlermeldung. Diese Sockets werden über die Wochen natürlich immer mehr
so daß ich ewig viele Fehlermeldungen bekomme.

Ich versuche ein Disconnect für einen einzelnen Socket hinzukriegen finde aber nichts wie das geht.
Wenns überhaupt mit LNet machbar ist. Also entweder beim Senden wenn die Fehlermeldung kommt,
oder schon bei OnAcceppt vom Listener wenn eine ungewollte IP Adresse in PeerAddress auftaucht.
Wenn ich ein normales Disconnect mache, fliegen ja leider alle Sockets die der Server acceppted hat
raus und z.B. Putty funktioniert danach nicht mehr.
Momentan behelfe ich mir in dem ich nur an den Client(0) sende. Aber die schrottigen Sockets werden ja trotzdem
immer mehr.

Hat jemand eine Idee?
Vielen dank schon mal im Vorraus

Grüße
NoCee
Zuletzt geändert von NoCee am Mo 23. Mär 2020, 20:28, insgesamt 1-mal geändert.

corpsman
Beiträge: 1131
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus SVN Trunk, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von corpsman »

Ist eigentlich recht einfach:

Code: Alles auswählen

 
 
var clients:integer = 0;
 
Procedure TForm1.LTCPComponent1Accept(aSocket: TLSocket);
Begin
  // Mehr wie eine Eingehende Verindung unterbinden !
  If clients > 0 Then Begin
    aSocket.Disconnect(true);
    exit;
  End;
  inc(clients);
  caption := 'Clients: ' + inttostr(clients);
End;
 
 
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von af0815 »

NoCee hat geschrieben:..unsere IT macht seit geraumer Zeit im Netzwerk einen Portscan und connected sich
überall drauf wo ein Port offen ist. was die damit bezwecken kann ich nur raten.
...zweitens disconnecten die nicht sauber so daß immer der socket übrig bleibt.

Das ist löblich das die IT kontrolliert ob es Schwachstellen im System gibt, ob zB. ein Server für DOS-Attacken empfindlich ist oder gegen ungewollte Daten. Deswegen auch der nicht 'saubere' Disconnect und 'Müll'= Testdaten als Daten.

Für mich sieht es aus als hätten die einen Treffer bei dir gelandet :-)

ev. Abhilfen: Eine Liste mit deinen Sockets mitführen, die Anzahl der Sockets begrenzen, nicht verwendete (tote) Sockets aufräumen und die Sockets zeitmässig begrenzen, das nicht wer in ganz kurzer Zeit viele Sockets halb öffnen kann (DOS-Attacke). Am besten den Socket sofort freigeben wenn die ersten Daten nicht passen und keinesfalls mit einer Fehlerantwort zurücksenden. Damit ist klar das der Port für was verwendet wird.

BTW: Wenn die IT wollten könnten die einen DOS Angriff sicher auch testen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Das geht ja mal viel einfacher als ich vermutet habe.
Genau das was ich gesucht habe.
Vielen Dank für die Hilfe.

Bei uns wird EDV technisch alles dicht gemacht. Verständlich, aber unsereins kann da fast nicht mehr arbeiten.
2 Vieren Scanner und 2 Firewalls nur fürs interne. Wenn eine Netzwerkbaugruppe einer Maschine kaputt geht,
muß ich die neue mac nach Indien melden und die geben die dann am Switchport frei. Und das dauert.

Abhilfen: Eine Liste mit deinen Sockets mitführen

ist mir jetzt nicht klar wie das aussehen kann.
Ich krieg zwar bei einem acceppt die Peeraddress raus, aber wie sieht da die vorgeschlagene Liste aus?
Oder ist das wieder genau so einfach: Liste mit den IP-Adressen.

Gruß und Danke für die Hilfe
NoCee

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von af0815 »

NoCee hat geschrieben:
Abhilfen: Eine Liste mit deinen Sockets mitführen

ist mir jetzt nicht klar wie das aussehen kann.
Ich krieg zwar bei einem acceppt die Peeraddress raus, aber wie sieht da die vorgeschlagene Liste aus?
Oder ist das wieder genau so einfach: Liste mit den IP-Adressen.

Gemein war das so, jedesmal wenn du einen Socket die Verbindung freigibst, dann den in einer Liste mit einem Zeitstempel merken. Wird der Verbindung geschlossen so wird wieder aus der Liste ausgetragen. Wenn sich der Socket mit deiner App richtig kommuniziert das auch in der Liste vermerken, wenn nicht, dann nach einiger Zeit den einfach schliessen. Ev. auch merken ob sich zuviele anmelden, dann auch blockieren bzw. die ältesten nicht fertiggemeldeten Sockets rausschmeißen.

Das mit der IT kenne ich von meiner alten Firma, war ein internationaler Konzern mit Zentral-IT im Ausland mit ähnlichen Problemen. Ich konnte es durchsetzen, das die Maschinen und Geräte die in der Fertigung waren in ein eigenes Netz migriert wurden und dieses Fertigungsnetz auch von Administriert werden konnte. Zusätzlich wurde es so aufgebaut, das wir jederzeit den Stecker ziehen konnten (echt physikalisch gemeint) um die Produktion auch bei Angriffen im 'normalen' Netz sicherstellen zu können - zumindest grundlegende Funktionen. Jede Software die Daten weitergab musste diese auch für einen definierten Zeitraum auch lokal puffern können. Das ganze aber bitte nicht nur lokal in Europa, sondern auch Produktionsstätten weltweit. Ich habe mit dieser Segmentierung trotz allen Mehraufwand sehr gute Erfahrung gemacht und das Management auch. So konnte eine ganze Produktionseinheit den Standort wechseln und nur wenige Einheiten mussten den neuen Standort angepasst werden, da das Segment weltweit eindeutig war.

Daher kenne ich die Späße auch der Zentral IT und die K(r)ämpfe die damit verbunden sind. :D :shock: 8)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7096
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: LNet einzelnen Server Socket schließen

Beitrag von pluto »

Bei meinen Server/Client Projekten mit LNET, habe ich mir angewöhnt, dass es eine Art Login vom Client gibt.
Wenn dieser z.b. Ausbleibt, kann die Verbindung zum Client vom Server einfach unterbunden werden.

Abhilfe kann z.b. auch durch ein Regelmäßiges Ping vom Client sein. z.b. der Client Ping Alle X Sekunden den Server an, wenn dieser Ausbleibt, wird die Verbindung beendet vom Server zum Client.

So macht es z.b. MQTT.
MFG
Michael Springwald

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Ich versuche mich da gerade an einem Testprogrämmchen um Versuche mit den vorgeschlagenen Sachen
machen zu können. Ich scheitere aber immer noch an einer "Verbindungsliste".
Wie könnte so eine Liste aussehen. Da fehlt mir komplett der Ansatz.
Was ich momentan im Kopf zusammenkriege ist eine Tabelle mit

-laufender Nummer
-Ip-Adresse
-gewollter Zugang
-ungewollter Zugang (also ablehnen)

was ich jetzt nicht kapiere ist wie ich den einzelnen Socket (oder was auch immer)
in die Liste bekomme. Muß ich ja irgendwie in onaccept übernehmen.
Wenn ich jetzt genau diesem Teilnehmer einen Anmeldetext oder sonst was schicken will,
brauch ich ja genau diesen Socket.
Sagen wir mal, ich zieh einen Timer auf und will genau diesen Socket schließen wenn da nichts sinnvolles gekommen ist.
Im OnTimer event hab ich aber nicht diesen "asocket" mit dem ich ein aSocket.Disconnect(true) machen kann.
Da muß ich doch jetzt aus meiner Verbindungstabelle irgendwie den socket rauslesen können und dem Disconnect übergeben.
Aber wie ist mir überhaupt nicht klar. Das muß doch eine Variable sein, in der ich asocket speichern kann.
Aber da ist leider mein Wissen am Ende.

Zweiter Punkt den ich schon mal vor geraumer Zeit gesucht hatte:
Wie kann ich (mit LNet) einen ping an einen bestimmten Teilnehmer schicken.
Damit wollte ich mal ein keep alive machen. Habs aber damals nicht hinbekommen bzw. nichts im Netz gefunden.

Vielen Dank für eure Hilfe
Gruß
NoCee

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von af0815 »

Ich würde des Testansatz mal öffentlich machen :-)Schwarmintelligenz findet manchmal die Astlöcher in den Brettern die wir manchmal vor dem Kopf haben :-)

Im OnXXX Event wird ja immer ein Sender mitgegeben, den kann man sich hernehmen.

Ping ist insbesonders unter Linux ein Problem, da man als normaler Benutzer ganz einfach nicht die Rechte dazu hat. Ansonsten ist es kein Problem.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von af0815 »

Ich würde des Testansatz mal öffentlich machen :-)Schwarmintelligenz findet manchmal die Astlöcher in den Brettern die wir manchmal vor dem Kopf haben :-)

Im OnXXX Event wird ja immer ein Sender mitgegeben, den kann man sich hernehmen.

Ping ist insbesonders unter Linux ein Problem, da man als normaler Benutzer ganz einfach nicht die Rechte dazu hat. Ansonsten ist es kein Problem. Sieh mal unter pingsend von synapse nach.

Code: Alles auswählen

 
uses
  pingsend;
 
........
 
procedure PingServerSilent(const HostName: String; const AAppl: TApplication;
  var IsOk: Boolean);
var
  cnt: Integer;
  aPing: TPINGSend;
begin
  aPing:= TPINGSend.Create;
  try
    aPing.Timeout:=500;
    cnt := MaxPingCnt;
    aPing.Sock.SocksTimeout:= 500;
    while not aPing.Ping(HostName) and (cnt > 0) do begin
      dec(cnt);
      sleep(10);
      if (AAppl) <> nil then
        AAppl.ProcessMessages;
    end;
    IsOk := (cnt > 0);
  finally
    aPing.Free;
  end;
end;
 


Edit: Für Linux hat sich sowas als nötig erwiesen, damit der Ping sicher als Benutzer (ohne root) geht - ist bei mir aus einem Projekt für RasPi bzw. Debian basierenden Systemen. Muss einmalig nach dem erstellen bzw. kopieren der ausführbaren Datei aufgerufen werden. Wichtig dabei ist, der setcap Befehl kann nicht gesplittet werden. Frei nach dem Motto des Highlanders-> Es kann nur einen geben. Daher der letzte setcap zählt und dort müssen alle Rechte beinhaltet sein.

Code: Alles auswählen

 
#!/bin/bash
sudo setcap CAP_NET_RAW,CAP_SYS_TIME,CAP_NET_BROADCAST,CAP_NET_BIND_SERVICE,CAP_FOWNER,CAP_IPC_OWNER,CAP_SYS_RAWIO=+ep /home/xx/data/myprog
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Danke für die Infos.
Das mit dem Ping werde ich später mal ausprobieren.


corpsman hat geschrieben:Ist eigentlich recht einfach:

Code: Alles auswählen

 
 
var clients:integer = 0;
 
Procedure TForm1.LTCPComponent1Accept(aSocket: TLSocket);
Begin
  // Mehr wie eine Eingehende Verindung unterbinden !
  If clients > 0 Then Begin
    aSocket.Disconnect(true);
    exit;
  End;
  inc(clients);
  caption := 'Clients: ' + inttostr(clients);
End
 


Ich hab damit mal verschiedene Versuche gemacht.
Das funktioniert zwar, hat aber das Problem daß das LNet irgendwie nicht mitbekommt.
Wenn ich folgendes mache:

Code: Alles auswählen

 
Edit1.Text:= inttostr(FNetServerA.Count-1);
  writeln('ServerA.Cout: '+inttostr(FNetServerA.Count-1));
  FNetServerA.IterReset;
  i:=1;
  while FNetServerA.IterNext do begin
    writeln('ServerA Nr: '+inttostr(i));
    i:= i+1;
  end;     
 


Wenn ich also nur 1 socket zulasse, mich z.B. mit Putty 5 mal verbinde, bleibt nur das erste Putty offen.
Die anderen werden also sofort beendet. So weit ja ok.
Aber bei FNetServerA.Count werden die Verbindungen weiter mitgezählt.
Ein OnDisconnect Event kommt auch nicht.
Was ich auch noch probiert habe, was sogar funktioniert ist eine Variable zu benutzen.
var
mysocket: TLSocket;
...
if (FNetServerA.Count-1)>2 then mysocket:= aSocket;

und dann mit einem ButtonClick
mySocket.Disconnect(true);

Wäre eigentlich genau das was ich machen wollte, hat aber das gleiche Problem wie oben.
Die Verbindung wird zwar zugemacht, LNet kriegts aber ebenfalls nicht mit.

Hat jemand dafür eine Lösung?

Vielen Dank schon mal im Vorraus.

Gruß
NoCee

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Hallo,
Ich hab mir jetzt auch mal andere Pakete angeschaut weil LNet zwar prima ist, aber halt nicht so mächtig.
Bei Indy hab ich gelesen, daß das nicht ganz easy sein soll.
Darauf hin hab ich auch Synapse angeschaut weil ich das sowieso wegen Synaser schon auf dem Rechner hab
bin da aber nicht weit gekommen. Im Netz wird mehrfach von Beispielen geschrieben die ich aber nicht finde.
Die Komponente hab ich mit dem Onlinepaketmanager geholt. Da sind aber keine Beispiele dabei.
Kann mir jemand sagen wo ich die finde, oder sind da gar keine dabei?
Und/oder weiß jemand eine gute Seite wo Synapse beschrieben wird?

Für Hilfe wäre dankbar
Gruß
NoCee

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet einzelnen Server Socket schließen

Beitrag von af0815 »

Schau auf den Seite vom Lukas Gebauer nach, dort sind auch Beispiele bzw. Links dazu. Ararat Synapse bei Google bzw. gebauer synapse hilft.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: LNet einzelnen Server Socket schließen

Beitrag von NoCee »

Ok
danke für den Hinweis.
Auf der Seite war ich logischerweise schon.
Nur mit dem was da auf der Seite steht konnte ich nicht all zu viel anfangen.
Ich hab spaßeshalber mal von einer anderen Seite Synapse runter geladen und siehe da
Beispiele sind da. Wird halt beim Onlinepaketmanager nicht mir runter geladen.
So wie das jetzt aussieht, muß man da für einen Chatserver für jeden Client einen
eigenen Serverthreat machen. Damit hätte ich die Möglichkeit den Threat (Client) den ich nicht will
abzuschießen.

Ich hab da noch was interessantes gefunden das mir ein ganzes Stück weiterhilft da auch mit Synapse gemacht.
https://wiki.freepascal.org/nxPascal
für den Fall daß einer hier landet und was ähnliches sucht.
Das ist ein Spiel das über Netzwerk funktioniert und dessen Netzwerkserver
ist das interessante an dem Projekt (für mich).
Macht für jeden Clint einen eigenen Serverthreat auf.

Damit hab ich erst mal wieder zu tun
Ich wünsche einen schönen Abend
NoCee

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4306
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: [erledigt] LNet einzelnen Server Socket schließen

Beitrag von af0815 »

Das mit dem Thread per Client ergibt sich logischerweise aus dem Umstand, das jeder Client sich über einen Port verbindet und normalerweise mehr oder minder zustandlos Abfragen stellt. Damit kannst du keinen Port sharen und mehrere Clients mit einem Thread versorgen. Nur genau dort ist das Problem, das man laufend prüfen muss ob da was tot ist oder nicht (oder ein Angriff). Bei den Implentationen für MQTT unter Pascal kann man da Verfahren sich ansehen wenn man eine Server auseinander nimmt. Wobei die auch nicht unbedingt allzu stark gegen DOS-Attacken gewappnet sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten