# Sockets

Originalmente a implementação de sockets foi feita no BSD 4.2 em 1983, e depois trazida para o Linux com algumas mas poucas alterações.

Socket provê a comunicação entre duas pontas (fonte e destino), entre dois processos que estejam na mesma máquina (Unix Socket) ou na rede (TCP/IP Socket).

Focando nas comunicações web, e usando o modelo TCP/IP como referencia, os sockets estão entre a camada de aplicação e a camada de transporte.

O Socket vai funcionar como uma interface entre a camada de Aplicação e a de Transporte, possibilitando que haja uma abstração dos detalhes da pilha TCP/IP, e consequentemente, dando a sensação que os processos envolvidos na sensação estão a comunicar diretamente entre si, no entanto, ela está passando pela rede. Essa abstração gerada pelos Sockets é o que chamamos de comunicação lógica. Outra forma de entender os Sockets é que eles são a "interface" de comunicação interprocessos.

Todo o cliente deve conhecer o socket do servidor (ip:porta) para se comunicar, mas o servidor só vai conhecer o socket do cliente quando este realizar uma conexão com ele, ou seja, a conexão no modelo cliente-servidor é sempre iniciada pelo cliente.

A porta do servidor precisa de ser previamente conhecida pelo cliente, enquanto que pro servidor não importa saber previamente a porta do cliente, ele vai ter acesso a ela a quando realizar a conexão com o cliente.

# Portas que podem ou não ser usadas

Portas Descrição
0-1023 well-known ports ou portas do sistema. Apenas o coadministrador pode executar um servidor que escute estas portas. São atribuídas pela Internet Corporation for Assigned Names and Numbers (ICANN)
1024 - 49151 portas do utilizador, ou portas registadas
> 49151 dinâmicas, portas privadas

# Principais funções (primitivas) fornecidas


getaddrinfo()   // Traduz nomes para endereços sockets
socket()        // Cria um socket e retorna o descritor de arquivo
bind()          // Associa o socket a um endereço socket e uma porta
connect()       // Tenta estabelecer conexão com um socket
listen()        // Coloca o socket a espera de conexão
accept()        // Aceita um nova conexão e cria um socket
send()          // Caso conectado, transmite mensagens ao socket
recv()          // Recebe mensagens através do socket
close()         // Termina a conexão com o descritor de arquivo
shutdown()      // Termina a comunicação do socket

# Comunicação Cliente - Servidor

# Servidor

  • Cria o Socket
  • Associa o Socket a um endereço local
  • Aguarda por conexões da parte cliente
  • Aceita conexões
  • Lê as requisições
  • Envia (ou não) uma resposta
  • Fecha o Socket

# Cliente

  • Cria o Socket
  • Estabelece a conexão
  • Envia uma requisição
  • Aguarda (ou não) a resposta
  • Fecha o Socket

# 📚 Saber mais

O que são e como funcionam os sockets (opens new window)

Lesson: All About Sockets (opens new window)

Learn Unix Soket (opens new window)

Sistemas Operativos (opens new window) pag. 509