Como usar o nc para escutar em uma porta TCP indefinidamente?

Como usar o nc para escutar em uma porta TCP indefinidamente?

Quero ler os dados que chegam em uma porta TCP específica indefinidamente e despejar os dados em um arquivo. Eu tentei muitas variações diferentes, ncmas não está funcionando para mim. Na maior parte do tempo, não estou recebendo nenhum erro no console. Abaixo está o que eu tentei:

nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile

Agradeço sua ajuda..

Responder1

Quero ler os dados que chegam em uma porta TCP específica indefinidamente

Isso realmente não faz sentido ... se você estava afinal de contas chegando em uma porta UDP, tudo bem - o TCP, entretanto, é um protocolo baseado em conexão. Depois que um cliente se conecta, e você accept(), você acaba com dois soquetes - um de escuta e outro conectado ao cliente ... ncfechará o soquete de escuta original e lidará individualmente com o cliente.


Se você quiser ouvir a conexão de vários clientes, tente usar socat:

socat TCP-LISTEN:12345,fork FD:1 >> ../myfile

Isso configurará um soquete de escuta e criará um novo processo na conexão - mantendo o soquete de escuta escutando. Todos os dados recebidos serão gravados em stdout (descritor de arquivo 1), que é redirecionado ../myfilepara anexar.

OBSERVAÇÃO: os dados serão recebidos de qualquer número de clientes, sem ordem garantida e sem enquadramento... ou seja: será uma confusão de dados confusos se você tiver mais de um cliente ao mesmo tempo.


Se quiser socatmanipular o arquivo para você, você pode usar um dos CREATEou OPEN(veja opágina de manual):

socat TCP-LISTEN:12345,fork OPEN:../myfile,append

Se você está satisfeito com um "um cliente por vez"abordagem e, em seguida, coloque ncem um loop:

while :; do nc -l 12345; done >> ../myfile

Teste isso com nc:

nc localhost 12345

Responder2

a tela à esquerda

nc -l 1234 inicia o servidor.

a tela à direita nc 127.0.0.1 1234se conecta.

parece que você errou nos comandos.

Vale a pena saber também se você está usando o gnu ou o bsd, o meu é o bsd. man nc mostra "NC(1) Manual de Comandos Gerais BSD". Para iniciar o servidor no GNU, pode ser necessário -l com -p. Para conectar o cliente ao servidor em qualquer porta, nunca usaremos -p.

insira a descrição da imagem aqui

Você também pode usar -v

insira a descrição da imagem aqui

Seu problema imediato foi que você não estava conseguindo fazê-lo funcionar.

Sua pergunta é sobre ser indefinido, e eu observaria que se você fizer ctrl-c no lado do cliente, além de interromper a conexão, ele interromperá o servidor. Você pode colocar esse servidor escutando em loop. Isso funciona. Então o servidor continua escutando e ainda estará lá se você tentar se conectar novamente após um ctrl-c do cliente.

insira a descrição da imagem aqui

informação relacionada