Estou mexendo nisso há algum tempo, então suspeito que algum tipo de mal-entendido fundamental sobre como os tubos funcionam é a causa raiz dos meus problemas.
Meu objetivo é iniciar uma conexão TCP com algum host remoto via netcat
e ter dois pipes nomeados no sistema de arquivos: um que os processos podem ler para obter dados recebidos e outro que os processos podem gravar para servir como dados de saída. Atualmente, estou usando a seguinte construção:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
A partir daqui, gostaria de permitir que outros processos leiam e gravem para / a partir dessa conexão TCP aberta. Isso deveria "funcionar" ou existe uma razão pela qual uma construção como essa não pode funcionar?
O que parece acontecer no momento é que eu posso ler out
sem problemas, mas quando escrevo in
, recebo uma saída mencionando um cano quebrado e toda a comunicação subsequente parece estar morta. Pensamentos?
(Relacionado: Eu originalmente usei:
netcat foo.bar.org 4000 < out > in &
mas o encontrou bloqueando a espera pela entrada. Também estou curioso sobre isso, mas provavelmente será melhor abordado em uma pergunta separada.)
write(stdout): Broken pipe
depois (ou logo depois) da gravação noout
pipe.Eu também havia enfrentado esse problema. O principal problema é
netcat
. É uma ótima ferramenta, mas fecha a conexão quando um de seus descritores de arquivo de entrada ou saída é fechado. Ele não faz nada quando o servidor não está escutando e sai quando o outro ponto é fechado. Contanto que você configure o servidor corretamente e mantenha os descritores de arquivos abertos, ele funcionará. Por exemplo, testei o seguinte cenário e funcionou muito bem: em uma configuração de terminal, um servidor de eco (configurei como abaixo):agora em outro terminal, configure sua conexão fifo com o seu servidor:
imprima o que o servidor enviar para você (e mantenha-o em execução, se você usar o
in
fifo em um aplicativo que fecha uma extremidade em sua terminação,netcat
fecha a conexão)e no mesmo terminal:
agora o que você digitar será impresso novamente (depois de pressionar Enter). Fechar este comando também fechará a conexão.
fonte
netcat -t -l -p 4000 < loopFF | tee loopFF
não causa um loop infinito de feedback consigo mesmo?netcat
fecha sempre que uma de suas conexões de rede fecha. Se você fechar o cliente (que envia uma string e recebe a mesma), onetcat
servidor também será fechado. Eu escrevi um código de servidor para mim neste caso, que se bifurca para lidar com vários clientes e reconectar clientes.A análise de Steven Monday parece boa para mim:
cat
retorna após sua primeira gravaçãoout
porque o fifo éempty
. Para evitar isso, a solução é manter um processo com o fifo aberto no modo de gravação, o primeirocat
no exemplo abaixo:(O arquivo out-pid é a maneira de parar a coisa toda:.
kill -9 $(cat out-pid)
)Outro exemplo aqui .
fonte