2016-03-23 7 views
0

Auf dem Concurrent-Server, Server viele Kinder laicht (davon ausgehen, dass ich mehrere Verfahren, wenn Clients connet verwende). Wenn der Client also Sockets schließt (close()), sendet er FIN an den Server und empfängt ACK vom Server.wenn das Kind Server Socket schließen

Schließlich gibt Server read() Funktion 0 und exit() Funktion aufgerufen wird. Es bewirkt, dass der untergeordnete Server den Socket beendet und schließt, und sendet FIN an seinen Client.

In dieser Situation, wie kann Server empfangen ACK obwohl Buchse Kinder Server geschlossen ist? und wie kann Server FIN erneut senden, wenn Client die FIN nicht empfängt, obwohl es keinen verbundenen Socket wegen des Kindes gibt, das beendet wird?

Protokolliert Kernel, der bis Endbearbeitungsstation vier Handshaking Prozess des Sockets beendet, obwohl es geschlossen ist?

Antwort

1

Ja, tut es. close() ist normalerweise asynchron.

+0

Es bedeutet, dass 'close()' erst Endbearbeitungsstation Handshaking, wie Dateideskriptor im Kernel ist nicht vollständig geschlossen, zurückkehrt, wenn eine Prozeßdatei geöffnet wird, obwohl der Referenzzähler gleich Null ist? –

+0

Nein, das bedeutet nichts davon. 'Asynchron' bedeutet, dass * * * zurückkommt, bevor die Verarbeitung beendet ist, und die FD ist geschlossen, aber die Verbindung bleibt bestehen ... – EJP

1

Ja, close() auf Steckdosen ist in der Regel asynchron, und Steckdosen verweilen können nach der Anwendung beendet. Sie können sie leicht in netstat Ausgabe in ihrem entsprechenden Zustand (z. B. TIME_WAIT oder) sehen.

Verwandte Themen