![]() |
TClientSocket Socket wird nicht freigegeben
Hallo,
ich rechne mal damit, dass ich nicht der Erste mit diesem Problem bin. Allerdings habe ich offensichtlich nicht die richtigen Suchworte verwendet. Prinzipiell mache ich etwas ganz einfaches: Mit einer TClientSocket Komponente (D5, ctNonBlocking) wird die Verbindung zu einem Server aufgebaut und nach der Kommunikation wieder abgebaut. Das ist notwendig, weil die Gegenseite nunmal nur mit einem Partner sprechen kann und dementsprechend wieder freigegeben werden muss. Jetzt stellt sich für mich folgendes Problem dar: Der Ablauf an sich funktioniert völlig reibungslos. Wenn ich allerdings die Windowskommandozeile aufrufe und mir mittels netstat die verwendeten Sockets anzeigen lasse, sehe ich, dass keine meiner Verbindungen wieder freigegeben wird. Langer Rede kurzer Sinn: Irgendwann habe ich auf den betreffenden Rechnern schlicht keine freien Ressourcen mehr. Beim Beenden des Programms sind wieder alle Sockets frei. Welchen Trick übersehe ich? Viele Grüße Ingo |
AW: TClientSocket Socket wird nicht freigegeben
Hallo Ingo,
1) Erlaubt dir deine Serverseite vom Programmkonzept her keine Mehrfachverbindungen? Die Kapselung der WinSocks per TServerSocket erlaubt es dir nämlich definitiv mehrere eingehende Verbindungen anzunehmen und auch zu halten. 2) Wie beendest du denn die Socket Verbindung? Etwas Code wäre sicher hilfreich. Viele Grüße Zacherl |
AW: TClientSocket Socket wird nicht freigegeben
Zitat:
Sockets bleiben eine gewissse Zeit nach dem Beenden der Verbindungen ncoh geöffnet durch das Betriebssystem. Das SysInternals TCPView Tool ist noch ein wenig übersichtlicher als netstat, damit habe ich auch den Effekt nachvollzogen den man bei einer HTTP 1.0 Verbidung hat - die wird beiderseitig zwar geschlossen, ist aber immer noch eine Weile sichtbar (und dem "System" als Besitzer zugeordnet, nicht mehr der eigenen Anwendung). Das kann natürlich schnell zu Überlastungen führen. |
AW: TClientSocket Socket wird nicht freigegeben
Sollte es an CLOSE_WAIT liegen, hier noch ein hilfreicher Artikel:
![]() |
AW: TClientSocket Socket wird nicht freigegeben
Hi,
sorry.... die Codeschnipsel habe ich vergessen. Prinzipiell relativ einfach: Erzeugen des Clients: DrClient := TClientSocket.Create(nil); [..] DrClient.Address := sDrucker_IP ; DrClient.Port := iServer_Port; DrClient.ClientType := ctNonBlocking; [..] // Lokale Proceduren zuordnen DrClient.OnError := DrClientError ; DrClient.OnConnect := DrClientConnect ; DrClient.OnDisconnect := DrClientDisconnect ; DrClient.OnRead := DrClientRead ; DrClient.OnWrite := DrClientWrite ; DrClient.OnConnecting := DrClientConnecting ; [..] Öffnen der Verbindung: DrClient.Open; Schließen der Verbindung: DrClient.Close; Die Verbindungen stehen im Status WARTEN bzw. WAIT Hoffe, ich konnte mich verständlicher ausdrücken. MFG Ingo |
AW: TClientSocket Socket wird nicht freigegeben
Hi,
Zitat:
MFG Ingo |
AW: TClientSocket Socket wird nicht freigegeben
Zitat:
Wenn man die Verbindung zum Server wiederverwenden könnte - also das CLOSE erst wenn man keine weiteren Anfragen mehr senden / Daten vom Server erhalten will), reduziert sich das Problem. Das entspricht dem keep-alive in HTTP 1.1. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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