Aula 21: TCP Sockets — servidor e cliente
TCP (Transmission Control Protocol) é a base de toda comunicação confiável em rede. Quando você abre um navegador, roda um Git fetch, ou conecta dois processos NCCL para treinamento distribuído — na maioria dos casos o TCP está trabalhando nos bastidores. Nesta aula vamos escrever um servidor TCP e
Imagine um servidor TCP como um restaurante. Primeiro você escolhe um número de mesa (bind na porta), depois abre a porta e anuncia 'estamos abertos' (listen), e então senta e espera um cliente entrar (accept). O cliente chega (connect), senta à mesa, faz o pedido (send), e recebe o pedido de volta (recv). O TCP garante que cada prato chegue na ordem certa e sem faltar nada — como um garçom que confere se cada prato chegou antes de servir o próximo.
- socket
- Um ponto final para comunicação em rede. Representado no código como um file descriptor (número inteiro) no qual você pode escrever e ler exatamente como em um arquivo.
- bind
- Atribuição de um endereço IP e uma porta a um socket. A syscall bind() diz ao kernel: 'este socket vai receber conexões que chegam na porta X'.
- listen
- Passagem do socket para o modo passivo, no qual ele fica pronto para aceitar conexões recebidas. O parâmetro backlog define quantas conexões pendentes o kernel pode manter na fila.
- accept
- Retirada da próxima conexão da fila de espera. Retorna um novo file descriptor dedicado apenas àquele cliente. O socket original continua escutando outros clientes.
- SO_REUSEADDR
- Uma opção de socket que permite reocupar a porta imediatamente após o servidor fechar, sem esperar o fim do estado TIME_WAIT. Essencial no desenvolvimento para evitar 'Address already in use' a cada reinício.