Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dienst. TCP/IP hat das Sicherheitslimit erreicht... (https://www.delphipraxis.net/138073-dienst-tcp-ip-hat-das-sicherheitslimit-erreicht.html)

Jackie1983 3. Aug 2009 09:57


Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Servus,

diese Meldung kommt erst seit ich meinen Dienst installiert habe.
Zitat:

Ereignistyp: Warnung
Ereignisquelle: Tcpip
Ereigniskennung: 4226
Beschreibung:
TCP/IP hat das Sicherheitslimit erreicht, das für die Anzahl gleichzeitiger TCP-Verbindungsversuche festgelegt wurde.
Der Dienst versucht alle 100ms eine Verbindung zum Server aufzubauen.
Hier mal der Timer.
Delphi-Quellcode:
  //Noch Online?
  if not fClient.Active then begin
    Synchronize(SetClientOnline); //-> fClient.Active := true;
    //auf verbindung kurz warten
    while not fClient.Active do
    begin
      sleep(100);
      inc(i);
      if (i=10) or (fClient.Active) then break;
    end;
    if not fClient.Active then fClient.Active := false;
  end;
  //Jobs zum server senden
  if fClient.Active then
  begin
    //...
kann es sein das zu viele Verbindungen geöffnet werden und nicht richtig geschlossen, oder so?

Gruß

FaTaLGuiLLoTiNe 3. Aug 2009 10:05

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Vielleicht solltest du für die Zeit der 'auf Verbindung kurz warten' - Schleife den Timer disablen, weil der sonst alle (circa) 100 ms anspringt und den Verbindungsaufbau neu anstösst, obwohl die Socket - Komponente gerade schon dabei ist, die Verbindung aufzubauen.

mashutu 3. Aug 2009 10:10

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Servus,

Zitat:

Zitat von Jackie1983
Hier mal der Timer.

Sieht aber nicht wie ein TTimer aus, was Du da machst.
Zitat:

Zitat von Jackie1983

Delphi-Quellcode:
  //Noch Online?
  if not fClient.Active then begin
    Synchronize(SetClientOnline); //-> fClient.Active := true;
    //auf verbindung kurz warten
    while not fClient.Active do
    begin
      sleep(100);
      inc(i);
      if (i=10) or (fClient.Active) then break;
    end;
    if not fClient.Active then fClient.Active := false;
  end;
  //Jobs zum server senden
  if fClient.Active then
  begin
    //...
kann es sein das zu viele Verbindungen geöffnet werden und nicht richtig geschlossen, oder so?

Ja.
Vermutlich muesstest Du noch ein wenig mehr Code posten.
1.) wurde die var i initialisiert?
Wenn nicht startet sie bspw. bei 389198 und erreicht niemals 10

2.)
if not fClient.Active then fClient.Active := false;

Was soll dieses Statement. Wenn die Variable false ist wird sie auf false gesetzt????
Wenn man so etwas sieht, steht zu befuerchten, dass noch mehr Fehler im Code aussenherum sind.

Bernhard Geyer 3. Aug 2009 10:17

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Zitat von Jackie1983
Delphi-Quellcode:
      sleep(100);

Autsch. Da viele TCP/IP-Komponenten asynchron arbeiten haben diese keine Chance die verbindung aufzubauen. Du solltet dein Programm auf Event-Handling umbauen.



Und MS hate ein Grenze eingebaut um für Viren/Würmen die Verbreitungsgeschwindigkeit etwas zu trosseln so das diese nicht willt versuch nach Infektion gleich wieder hunderte PC's zu infizieren.

Jackie1983 3. Aug 2009 10:25

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Zitat von FaTaLGuiLLoTiNe
Vielleicht solltest du für die Zeit der 'auf Verbindung kurz warten' - Schleife den Timer disablen, weil der sonst alle (circa) 100 ms anspringt und den Verbindungsaufbau neu anstösst, obwohl die Socket - Komponente gerade schon dabei ist, die Verbindung aufzubauen.

Aber wenn der Server nicht erreichbar ist soll der Client es ja wieder versuchen solange bis die Verbindung steht.

Zitat:

Zitat von mashutu
Servus,
Sieht aber nicht wie ein TTimer aus, was Du da machst.

Es ist aber ein Timer.

Zitat:

Zitat von mashutu
Vermutlich muesstest Du noch ein wenig mehr Code posten.

Das ist eigentlich der wichtige Teil, da wo die Verbindung aufgebaut wird.

Zitat:

Zitat von mashutu
2.)
if not fClient.Active then fClient.Active := false;

Was soll dieses Statement. Wenn die Variable false ist wird sie auf false gesetzt????

Weil, wenn die Verbindung aufgebaut wird, so wie es FaTaLGuiLLoTiNe oben geschrieben hat, wollte ich damit die Verbindung komplett schließen so das im System auch nichts mehr ist, aber so ist es ja leider nicht.

Zitat:

Zitat von Bernhard Geyer
Autsch. Da viele TCP/IP-Komponenten asynchron arbeiten haben diese keine Chance die verbindung aufzubauen. Du solltet dein Programm auf Event-Handling umbauen.

Da ich bis jetzt nur mit den Sockets so gearbeitet habe ohne das immer eine Verbindungen stehen muss, wei ich nicht wie man die Anwendung auf Event-Handling umbauen könnten, da brauche ich schon einen Denkanstoss.

Gruß

Bernhard Geyer 3. Aug 2009 10:31

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Zitat von Jackie1983
Es ist aber ein Timer.

Synchronize deutet eher auf die Verwendung von Threads hin.

Zitat:

Zitat von Jackie1983
Da ich bis jetzt nur mit den Sockets so gearbeitet habe ohne das immer eine Verbindungen stehen muss, wei ich nicht wie man die Anwendung auf Event-Handling umbauen könnten, da brauche ich schon einen Denkanstoss.

Du mußt die OnConnect/OnError/...-Eventhandler der Komponenten verwenden.

Jackie1983 3. Aug 2009 10:35

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Zitat von Bernhard Geyer
Synchronize deutet eher auf die Verwendung von Threads hin.

Ein Thread mit einem Timer.

Zitat:

Zitat von Bernhard Geyer
Du mußt die OnConnect/OnError/...-Eventhandler der Komponenten verwenden.

Lol ok, dachte jetzt die von Windows. Das sollte ich noch hinbekommen :)

quendolineDD 3. Aug 2009 11:42

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Ein Thread mit einem Timer.
Also die TTimer-Komponente benötigt eine Nachrichtenschleife, damit diese ordnungsgemäß funktioniert. Eventuell liegt hier das Problem.
Zum Thema "Thread und TTimer" gibt es genug Threads im Forum.

Jackie1983 3. Aug 2009 11:43

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Zitat:

Zitat von quendolineDD
Zitat:

Ein Thread mit einem Timer.
Also die TTimer-Komponente benötigt eine Nachrichtenschleife, damit diese ordnungsgemäß funktioniert. Eventuell liegt hier das Problem.
Zum Thema "Thread und TTimer" gibt es genug Threads im Forum.

Glaube nicht, da ich diese habe.
Delphi-Quellcode:
  while GetMessage(Msg, 0, 0, 0) do
    DispatchMessage(Msg)

MichaM 4. Aug 2009 17:55

Re: Dienst. TCP/IP hat das Sicherheitslimit erreicht...
 
Es ist absolut nicht notwendig im 100 ms-Takt die Verbindung
herstellen zu wollen. Wenn die Verbindung nicht hergestellt
werden kann dauert es mehrere (bei mir 20) Sekunden, bis es
eine Fehlermeldung gibt. Selbst auf dem lokalen Rechner ist
es noch eine Sekunde bis die Fehlermeldung kommt.

Wenn es klappt, dauert es auch einige 100 ms.

Also einmal anstossen, merken dass schon angestossen, freuen
wenn Connect hergestellt, sonst erst nach Fehlermeldung neuer
Versuch.

Von welchem Typ ist eigentlich fClient ?
Wenn es sich um TClientSocket handelt: Man kann das
active zwar setzen, aber wenn man es zurückliest
ist es erst dann TRUE, wenn die Verbindung hergestellt ist.

Gruss MichaM


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz