Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Socket-Fehler 10055 (https://www.delphipraxis.net/126927-socket-fehler-10055-a.html)

Chrisa 5. Jan 2009 05:34


Socket-Fehler 10055
 
Hallo,
ich habe folgendes Problem mit den Sockets in Delphi 7. Ich versuche mit einem TClientSocket alle 5 Sekunden eine Verbindung zum Server herzustellen (ClientSocket1.Open), wenn dieser beim ersten Versuch nicht erreichbar ist. Sobald die Verbindung erfolgreich aufgebaut werden konnte, wird diese Prozedur natürlic gestoppt. Jedoch erhalte ich nach einiger Zeit (auf meinem Rechner nach ca. 7400, auf meinem Laptop nach ca. 4000 Verbindungsversuchen) den Socket-Error 10055. Der Socket-Buffer oder die Warteschlange ist voll. Jedoch lasse ich bei jedem Socket-Fehler (in der Prozedur ClientSocket1Error) den Socket eigentlich schliessen.
Delphi-Quellcode:
procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
...
ErrorCode:=0;
Socket.Close;
ClientSocket1.Close;
...
end;
Wenn ich im Taskmanager mir den Speicherverbrauch der Anwendung anschaue und beobachte, fällt mir auf, dass dieser immer größer wird. Selbst wenn ich den Socket lösche (ClientSocket1.Free) verringert sich der Speicherverbrauch nur um ca. 4 KB, auch wenn der vorher durch die Verbindungsversuche schon um viel mehr angestiegen ist als 4 KB.
Habe schon hier im Forum geguckt und gegooglt, jedoch keine akzeptable Lösung gefunden. Kann man die (anscheind) noch offenen Verbindungen löschen/beenden?

mfG Chrisa

Darkface 5. Jan 2009 05:57

Re: Socket-Fehler 10055
 
Das Problem ist das du viel zu schnell versuchst eine neue Verbindung aufzubauen! Wie er dir ja auch sagt, die Warteschlange auf Verbindungsversuche kann dann nicht mehr abgearbeitet werden. Ein Verbindungsversuch braucht länger als 5 sec!

MfG Darkface :-)

[EDIT] Ach ja und dem entsprechend wird das Error - Event auch erst längere Zeit nach deinen 5 sec ausgeführt! Nämlich genau dann wenn er wirklich erst den Verbindungsversuch abbricht! Versuche den nächsten Versuch erst dann zu starten wenn das Error-Event ausgelöst wurde!

Chrisa 5. Jan 2009 09:28

Re: Socket-Fehler 10055
 
erstmal, danke für die schnelle Antwort, aber so sicher wäre ich da nicht. Habe auch einfach mal zum testen n stopper mit reingebastelt, der den ständigen Verbindungsaufbau abbricht. Selbst nach 15 Minuten, war der Speicherplatzverbrauch des Programms genausohoch wie vor dem stoppen. Und bei mir aufm Rechner kam zumindest wenn man das "ErrorCode:=0" weglässt in weniger als 5 sekunden schon ein Error über den Bildschrim gewandert. Aber ich werd nochmal n Testlauf starten, wie lange er durchhält ohne Error mit 10-15 Sekunden. Vllt. klappts ja wirklich :-D dann würde ich mich nur über den sinnlos verbratenen Speicher wundern.
mfg Chrisa

nahpets 5. Jan 2009 10:50

Re: Socket-Fehler 10055
 
Hallo,

wie machst Du das mit der Fehlerbehandlung?

Delphi-Quellcode:
procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
...
  Try
    ...
    Socket.Open;
    ClientSocket1.Open;
    ...
  Except
    ErrorCode:=0;
    Socket.Close;
    ClientSocket1.Close;
  end;
...
end;
Wenn der Fehler 10055 ausgelöst wird, tritt eine Exception auf, eventuell kommst Du dadurch nicht mehr am Close und/oder den Stellen, an denen Du irgendwas freigibst, vorbei.

Stephan

Helmi 5. Jan 2009 11:02

Re: Socket-Fehler 10055
 
Hallo,

ich hatte mal das gleiche Problem.

Ich habs sinngemäß so gelöst:

Delphi-Quellcode:
procedure TForm1.Timer_toggleTimer(Sender: TObject); var
  S_Address: String;

begin
  ClientSocket1.Active := false;

  //ClientSocket schliessen
  ClientSocket1.Socket.Close;
  ClientSocket1.Close;

  //Port und Adresse setzen
  ClientSocket1.Port   := SpinEdit_Port.Value;
  ClientSocket1.Address := S_Address;

  try
    ClientSocket1.Open;
  except
    ClientSocket1.Active := false;
    ClientSocket1.Socket.Close;
    ClientSocket1.Close;
  end;
end;
Sinngemäß deswegen, dass ich das früher so hatte, in der Zwischenzeit umgebaut habe. Aber es funktioniert noch so wie oben beschrieben.

Der Timer heisst bei mir Timer_toggle und ist so auf 5000 ms (5s) eingestellt

Chrisa 6. Jan 2009 13:42

Re: Socket-Fehler 10055
 
vielen Dank für eure Antowrten. Habe nun einmal versucht den Timer höher zu stellen und das scheint bis jetzt zu funktionieren. Immerhin hat er schon 12600 fehlgeschlagene Versuche ohne Error hintersich. Und Helmi's Lösung scheint zu funktionieren :-) Vielen Dank. Habe einfach mal zum testen den Timer auf nur 2 Sekunden gestellt, und der Zähler ist schon bei 24000 Versuchen ohne Error.
mfG Chrisa


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 Uhr.

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