La API de socket es el estándar de facto para las comunicaciones TCP / IP y UDP / IP (es decir, el código de red tal como lo conocemos). Sin embargo, una de sus funciones principales accept()
es un poco mágica.
Para tomar prestada una definición semiformal:
accept () se usa en el lado del servidor. Acepta un intento entrante recibido de crear una nueva conexión TCP desde el cliente remoto y crea un nuevo socket asociado con el par de direcciones de socket de esta conexión.
En otras palabras, accept
devuelve un nuevo socket a través del cual el servidor puede comunicarse con el cliente recién conectado. El socket antiguo (en el que accept
se llamó) permanece abierto, en el mismo puerto, escuchando nuevas conexiones.
Como accept
funciona ¿Cómo se implementa? Hay mucha confusión sobre este tema. Muchas personas afirman que aceptar abre un nuevo puerto y usted se comunica con el cliente a través de él. Pero esto obviamente no es cierto, ya que no se abre un nuevo puerto. En realidad, puede comunicarse a través del mismo puerto con diferentes clientes, pero ¿cómo? Cuando varios hilos llaman recv
al mismo puerto, ¿cómo saben los datos a dónde ir?
Supongo que es algo similar a la dirección del cliente asociada con un descriptor de socket, y cada vez que los datos pasan recv
se enruta al socket correcto, pero no estoy seguro.
Sería genial obtener una explicación exhaustiva del funcionamiento interno de este mecanismo.