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, nc
mas 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 ... nc
fechará 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 ../myfile
para 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 socat
manipular o arquivo para você, você pode usar um dos CREATE
ou 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 nc
em 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 1234
se 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.
Você também pode usar -v
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.