L'API socket est la norme de facto pour les communications TCP / IP et UDP / IP (c'est-à-dire le code réseau tel que nous le connaissons). Cependant, l'une de ses fonctions essentielles accept()
est un peu magique.
Pour emprunter une définition semi-formelle:
accept () est utilisé côté serveur. Il accepte une tentative entrante de créer une nouvelle connexion TCP à partir du client distant et crée un nouveau socket associé à la paire d'adresses de socket de cette connexion.
En d'autres termes, accept
renvoie un nouveau socket via lequel le serveur peut communiquer avec le client nouvellement connecté. L'ancienne socket (sur laquelle accept
on a appelé) reste ouverte, sur le même port, à l'écoute des nouvelles connexions.
Comment ça accept
marche? Comment est-il mis en œuvre? Il y a beaucoup de confusion sur ce sujet. De nombreuses personnes prétendent accepter d'ouvrir un nouveau port et que vous communiquez avec le client via celui-ci. Mais ce n'est évidemment pas vrai, car aucun nouveau port n'est ouvert. Vous pouvez en fait communiquer via le même port avec différents clients, mais comment? Lorsque plusieurs threads appellent recv
sur le même port, comment les données savent-elles où aller?
Je suppose que c'est quelque chose du genre que l'adresse du client est associée à un descripteur de socket, et chaque fois que des données arrivent, recv
elles sont acheminées vers la bonne socket, mais je ne suis pas sûr.
Ce serait formidable d'obtenir une explication approfondie du fonctionnement interne de ce mécanisme.