quand l’enfant ferme le socket du serveur

Sur le serveur simultané, le serveur génère de nombreux enfants (supposons que j’utilise plusieurs processus lorsque les clients se connectent). Donc, si le client ferme les sockets (fonction close() ), il envoie FIN au serveur et reçoit ACK du serveur.

Enfin, la fonction read() du serveur renvoie 0 et la fonction exit() est appelée. Il oblige l’enfant du serveur à se fermer et à fermer le socket et à envoyer FIN à son client.

Dans ce cas, comment le serveur peut-il recevoir ACK même si le socket enfant du serveur est fermé? et comment le serveur peut-il renvoyer FIN lorsque le client ne reçoit pas le FIN bien qu’il n’y ait pas de socket connecté à cause de l’enfant qui est arrêté?

Le kernel conserve-t-il le socket de ce processus terminé jusqu’à ce qu’il termine la transaction finale à quatre mains alors qu’il est fermé?

Oui. close() est normalement asynchrone.

Oui, close() sur les sockets est normalement asynchrone et les sockets peuvent persister après la fin de l’application. Vous pouvez facilement les voir dans la sortie netstat dans leur état approprié (par exemple, TIME_WAIT ou FIN_WAIT2 ).