![]() |
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:
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.
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ... ErrorCode:=0; Socket.Close; ClientSocket1.Close; ... end; 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 |
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! |
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 |
Re: Socket-Fehler 10055
Hallo,
wie machst Du das mit der Fehlerbehandlung?
Delphi-Quellcode:
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.
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; Stephan |
Re: Socket-Fehler 10055
Hallo,
ich hatte mal das gleiche Problem. Ich habs sinngemäß so gelöst:
Delphi-Quellcode:
Sinngemäß deswegen, dass ich das früher so hatte, in der Zwischenzeit umgebaut habe. Aber es funktioniert noch so wie oben beschrieben.
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; Der Timer heisst bei mir Timer_toggle und ist so auf 5000 ms (5s) eingestellt |
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 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz