0Pricing
Lua Academy · Aula

Fundamentos de TCP

Conecte-se e envie dados.

Fundamentos de TCP é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O Que é LuaSocket

LuaSocket é a biblioteca de rede de fato para Lua. Ela expõe soquetes TCP e UDP brutos, além de auxiliares de nível mais alto para HTTP, SMTP e FTP.

É um módulo externo em C, portanto não faz parte do Lua padrão. Você o instala por meio de LuaRocks e o carrega com require.

Nenhum dos trechos deste curso é executado em um ambiente de testes simples, pois eles acessam a rede.

local socket = require("socket")
print(socket._VERSION)

Criando um Soquete TCP

O objeto principal é o soquete mestre TCP, criado com socket.tcp(). Um soquete mestre recém-criado não está conectado nem associado a um endereço.

A partir de um mestre, você pode usar connect (transformando-o em um objeto cliente) ou bind+listen (transformando-o em um objeto servidor).

A maioria das chamadas retorna um valor ou nil junto com uma cadeia de erro, portanto sempre capture ambos.

local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) end

A Família de Endereços

O TCP funciona sobre IPv4 ou IPv6. socket.tcp() escolhe a família de forma tardia, enquanto socket.tcp4() e socket.tcp6() forçam uma delas.

Use socket.dns.toip(host) para resolver um nome de host para um endereço numérico antes de conectar, caso precise de controle explícito.

local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)

Conectando-se a um Host

conn:connect(host, port) executa a negociação de três vias do TCP. Em caso de sucesso, retorna 1; em caso de falha, retorna nil e uma mensagem de erro, como "connection refused" ou "timeout".

A função de conveniência socket.connect(host, port) cria um soquete e se conecta em uma única chamada.

local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) end

Enviando Dados

conn:send(data) grava bytes no soquete. Ela retorna o índice do último byte enviado. Com um soquete bloqueante, normalmente esse é o comprimento total de data.

O TCP é um fluxo de bytes, não um protocolo de mensagens, portanto um único send pode ser dividido ou combinado com outros durante a transmissão. Você precisa delimitar suas próprias mensagens.

local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)

Recebendo Dados

conn:receive(pattern) lê dados do fluxo. O padrão padrão "*l" lê uma linha sem a quebra de linha. "*a" lê até que a conexão seja fechada.

Você também pode passar um número para ler exatamente essa quantidade de bytes. Em caso de erro, a função retorna nil, uma cadeia de erro e todos os dados parciais recebidos.

local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")

Fechando a Conexão

Sempre chame conn:close() ao terminar para liberar o descritor de arquivo e enviar um TCP FIN.

Você pode fechar parcialmente com conn:shutdown("send") para sinalizar o fim do fluxo e continuar lendo a resposta do par. Isso é útil para protocolos de solicitação e resposta que usam "*a".

conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()

A Importância dos Tempos Limite

Por padrão, os soquetes bloqueiam indefinidamente. conn:settimeout(seconds) limita por quanto tempo uma chamada espera. O valor 0 torna o soquete não bloqueante.

Quando um tempo limite é atingido, a chamada retorna nil e a cadeia "timeout". Sempre defina um tempo limite em produção para evitar conexões travadas.

conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") end

TCP versus UDP

TCP é orientado a conexão, ordenado e confiável: os bytes chegam uma única vez e na ordem correta, ao custo de negociações e retransmissões.

UDP (socket.udp()) não é orientado a conexão e não é confiável, mas é leve e adequado para telemetria ou jogos. Este curso se concentra em TCP porque ele sustenta o HTTP.

Envios Parciais e Laços

Em soquetes não bloqueantes, send pode transmitir apenas parte da sua área de memória. Ele retorna nil, "timeout" e o índice do último byte gravado até então.

Um remetente robusto usa um laço, retomando no byte seguinte ao último enviado, até que toda a área de memória seja transmitida.

local i = 1
while i <= #data do
  local sent, err, last = conn:send(data, i)
  i = (sent or last) + 1
  if err and err ~= "timeout" then break end
end

Inspecionando a Conexão

conn:getpeername() retorna o IP e a porta remotos, enquanto conn:getsockname() retorna a extremidade local. Isso ajuda no registro e na depuração.

conn:setoption("keepalive", true) e conn:setoption("tcp-nodelay", true) ajustam o comportamento do soquete subjacente.

local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)

Verificação Rápida

Teste sua compreensão da semântica de recebimento do TCP.

Recapitulação

Você conheceu o objeto mestre TCP do LuaSocket, aprendeu a criar, conectar, enviar, receber e fechar soquetes, e viu como os tempos limite e o meio-fechamento moldam o comportamento.

Lembre-se de que TCP é um fluxo de bytes, cada chamada pode retornar nil, err e um soquete de produção sempre define um tempo limite. Em seguida, você reunirá essas partes em um cliente funcional.

Perguntas Frequentes

A aula “Fundamentos de TCP” é grátis?

Sim — o texto completo de “Fundamentos de TCP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Fundamentos de TCP”?

Conecte-se e envie dados. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Fundamentos de TCP”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos de TCP
  2. Construindo um cliente
  3. Construindo um servidor
  4. Solicitações HTTP
← Voltar para Lua Academy