A API do soquete é o padrão de fato para as comunicações TCP / IP e UDP / IP (ou seja, o código de rede como o conhecemos). No entanto, uma de suas principais funções accept()
é um pouco mágica.
Para emprestar uma definição semi-formal:
accept () é usado no lado do servidor. Ele aceita uma tentativa de entrada recebida para criar uma nova conexão TCP do cliente remoto e cria um novo soquete associado ao par de endereços de soquete dessa conexão.
Em outras palavras, accept
retorna um novo soquete através do qual o servidor pode se comunicar com o cliente recém-conectado. O soquete antigo (no qual accept
foi chamado) permanece aberto, na mesma porta, ouvindo novas conexões.
Como accept
funciona? Como é implementado? Há muita confusão sobre esse tópico. Muitas pessoas afirmam que aceitar abre uma nova porta e você se comunica com o cliente através dela. Mas isso obviamente não é verdade, pois nenhuma porta nova é aberta. Você realmente pode se comunicar através da mesma porta com clientes diferentes, mas como? Quando vários encadeamentos chamam recv
na mesma porta, como os dados sabem para onde ir?
Eu acho que é algo semelhante ao endereço do cliente associado a um descritor de soquete, e sempre que os dados chegam, recv
eles são roteados para o soquete correto, mas não tenho certeza.
Seria ótimo obter uma explicação completa do funcionamento interno desse mecanismo.