Der Dateideskriptor wird von der Anwendung zum Lesen / Schreiben aus dem Socket verwendet. Wenn die Anwendung close () aufruft, wird der Dateideskriptor sofort freigegeben.
Wenn die Anwendung hingegen shutdown () aufruft, bleibt der Dateideskriptor wirksam, sodass die Anwendung weiterhin vom / in den Socket lesen / schreiben kann.
Mythos: Sockets in TCP TIME_WAIT enthalten Dateihandles Hostage
Wenn Sie einen TCP / IP-Socket schließen, gibt das Betriebssystem den Socket nicht sofort frei. Aus komplexen Gründen muss die Socket-Struktur einige Minuten lang nicht im Umlauf sein, da die Wahrscheinlichkeit gering ist, dass ein IP-Paket nach dem Schließen auf diesem Socket ankommt. Wenn das Betriebssystem den Socket erneut verwendet, wird die Sitzung des neuen Benutzers dieser Verbindung von den verlorenen Paketen eines anderen beeinflusst.
Dies hält jedoch kein Dateihandle offen. Wenn Sie den Dateideskriptor des Sockets schließen, wird der Dateideskriptor selbst geschlossen. Sie erhalten nicht den Fehler "Zu viele Dateien geöffnet". Wenn zu viele Sockets geöffnet sind, akzeptiert Ihr Server möglicherweise keine neuen Verbindungen mehr. Es gibt Möglichkeiten, damit umzugehen (Sockets können wiederverwendet werden oder TCP TIME_WAIT wird gesenkt) - aber das Anheben des Limits für das Dateihandle gehört nicht dazu.
Mythos: Es dauert einige Zeit, bis die Dateihandles freigegeben sind
Dies hängt mit dem Mythos TCP TIME_WAIT zusammen. Die falsche Annahme, dass Sie beim Schließen eines Dateihandles einige Zeit warten müssen, bis das Betriebssystem das Handle freigibt.
Durch das Schließen eines Dateihandles wird eine beliebige os-Methode aufgerufen, die die Ressource freigibt, und das Betriebssystem gibt diese Ressource entweder sofort oder manchmal später frei, wie im Fall von Sockets. Close () gibt jedoch das Dateihandle in der Dateihandle-Tabelle sofort frei. Ihr Prozess hat die vollständige Kontrolle über seine Dateihandle-Tabelle und muss nicht warten, bis ein Slot in seiner eigenen Dateideskriptortabelle frei ist.