Eu estou n-escutando emlocalhost:2500
▶ nc -l 2500
_
Em outro terminal estou tentando me conectar a esta extremidade de escuta
▶ nc -zv localhost 2500
nc: connectx to localhost port 2500 (tcp) failed: Connection refused
Connection to localhost port 2500 [tcp/rtsserv] succeeded!
Por que parece que a primeira tentativa está falhando?
Também notei que quando a tentativa de conexão termina (aparentemente com sucesso) por algum motivo, meu processo de escuta é encerrado. Não faço ideia por que isso está acontecendo.
Existem muitas implementações diferentes do netcat.
Eu vou assumir que você não está usando a implementação tradicional, mas uma mais moderna, que pode lidar com IPv6, porque o 1º problema parece relacionado ao IPv6. Aqui estou usando a variante do OpenBSD
nc
(versão 1.217, no Debian 11 como 1.217-3).Primeira questão: conexão dupla
nc -l 2500
escuta no IPv4nc -zv localhost 2500
tenta primeiro se conectar ao host local IPv6::1
, falha e tenta de forma transparente como host local IPv4127.0.0.1
: sucessoMeu netcat dá mais informações:
Você pode evitar isso, por exemplo:
informando 127.0.0.1 no comando do cliente em vez de localhost ou usando a
-4
opção de tentar apenas IPv4.ou alterando as preferências de pilha dupla para a resolução de localhost para favorecer IPv4 em vez de IPv6. Em sistemas baseados em glibc, como a maioria dos Linux, isso pode ser feito adicionando isso em
/etc/gai.conf
:ou informando
-6
no comando do servidor que usará IPv6. Na verdade, as chances são de que o soquete IPv6 será padronizado para IPv4 + IPv6 de modo duplo conforme RFC 3493 .segundo problema: o comando do servidor termina
A varredura de modo zero do netcat com TCP simplesmente estabelece uma conexão e a encerra: zero dados são transferidos, mas uma conexão ainda foi estabelecida e fechada. Assim, o comando do servidor tendo feito seu papel termina por padrão (esse é o comportamento da variante do OpenBSD. Por exemplo, a variante original/tradicional não fazia isso, mas também não usava IPv6).
Adicione a opção necessária ao comando do servidor para que ele mantenha um soquete de escuta e não pare na primeira conexão recebida. Para a versão do OpenBSD esta é a opção
-k
: "Keep inbound sockets open for multiple connects":Observe que existem outras implementações do netcat e cada uma tem sua própria diferença sutil. Meu conselho sobre qual usar é: nenhum, use
socat
o que tem muito mais recursos.