AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TClientSocket Socket wird nicht freigegeben
Thema durchsuchen
Ansicht
Themen-Optionen

TClientSocket Socket wird nicht freigegeben

Ein Thema von Einhorn · begonnen am 12. Dez 2012 · letzter Beitrag vom 13. Dez 2012
Antwort Antwort
Einhorn

Registriert seit: 24. Jan 2006
3 Beiträge
 
#1

TClientSocket Socket wird nicht freigegeben

  Alt 12. Dez 2012, 17:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: TClientSocket Socket wird nicht freigegeben

  Alt 12. Dez 2012, 18:03
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: TClientSocket Socket wird nicht freigegeben

  Alt 12. Dez 2012, 18:14
Wenn ich allerdings die Windowskommandozeile aufrufe und mir mittels netstat die verwendeten Sockets anzeigen lasse, sehe ich, dass keine meiner Verbindungen wieder freigegeben wird.
In welchem Status sind die Sockets (TIME_WAIT, CLOSE_WAIT ...)?

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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: TClientSocket Socket wird nicht freigegeben

  Alt 12. Dez 2012, 18:19
Sollte es an CLOSE_WAIT liegen, hier noch ein hilfreicher Artikel:
http://blogs.technet.com/b/janelewis...lose-wait.aspx
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Einhorn

Registriert seit: 24. Jan 2006
3 Beiträge
 
#5

AW: TClientSocket Socket wird nicht freigegeben

  Alt 13. Dez 2012, 09:27
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
  Mit Zitat antworten Zitat
Einhorn

Registriert seit: 24. Jan 2006
3 Beiträge
 
#6

AW: TClientSocket Socket wird nicht freigegeben

  Alt 13. Dez 2012, 09:28
Hi,

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.
Die Serverseite stammt nicht von mir. Es handelt sich um eine Druckersteuerung eines Dritten auf die ich keinen Einfluss habe. Insofern bleibt mir nichts anderes übrig, als mich den Gegebenheiten anzupassen...

MFG

Ingo
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: TClientSocket Socket wird nicht freigegeben

  Alt 13. Dez 2012, 11:00
Schließen der Verbindung:

DrClient.Close;

Die Verbindungen stehen im Status WARTEN bzw. WAIT
Das ist normal - wenn der Client die Verbindung getrennt wird, bleibt der Socket noch eine Weile aktiv. Das ist aber erst bei über ca. hundert Verbindungen im TIME_WAIT Status ein potentielles Problem. (Je nach System auch ein paar mehr).

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.
Michael Justin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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