Un socket de cliente no escucha para las conexiones entrantes, inicia una conexión saliente al servidor. El socket del servidor escucha las conexiones entrantes.
Un servidor crea un socket, vincula el socket a una dirección IP y número de puerto (para TCP y UDP), y luego escucha las conexiones entrantes. Cuando un cliente se conecta al servidor, se crea un nuevo socket para comunicarse con el cliente (solo TCP). Se utiliza un mecanismo de sondeo para determinar si se ha producido alguna actividad en cualquiera de los sockets abiertos.
Un cliente crea un socket y se conecta a una dirección IP remota y un número de puerto (para TCP y UDP). Se puede usar un mecanismo de sondeo (select(), poll(), epoll(), etc.) para monitorear el socket en busca de información del servidor sin bloquear el hilo.
En el caso de que el cliente esté detrás de un enrutador que proporciona NAT (traducción de direcciones de red), el enrutador vuelve a escribir la dirección del cliente para que coincida con la dirección IP pública del enrutador. Cuando el servidor responde, el enrutador cambia su dirección IP pública a la dirección IP del cliente. El enrutador mantiene una tabla de las conexiones activas que está traduciendo para que pueda asignar las respuestas del servidor al cliente correcto.
Breve [introducción] (http://ssfnet.org/Exchange/tcp/tcpTutorialNotes.html) (relacionado con el protocolo TCP). – Vidul
El hecho de que la conexión sea directa o no cambia nada. Los bytes (en paquetes) llegan a su computadora (puede ser un buffer en su tarjeta de red) y como resultado se envía una señal a su software. –