He estado jugando con hacer que esto funcione por un tiempo, así que sospecho que algún tipo de malentendido fundamental sobre cómo funcionan las tuberías es la causa principal de mis problemas.
Mi objetivo es iniciar una conexión TCP a algún host remoto a través de netcat
y tener dos canales con nombre en el sistema de archivos: uno que los procesos puedan leer para obtener datos entrantes, y otro que los procesos puedan escribir para que sirvan como datos salientes. Actualmente estoy usando la siguiente construcción:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
Desde aquí, me gustaría permitir que otros procesos lean y escriban en / desde esta conexión TCP abierta. ¿Debería esto "simplemente funcionar", o hay una razón por la cual una construcción como esta no puede funcionar?
Lo que parece suceder en este momento es que puedo leer out
sin problemas, pero cuando escribo in
me sale un mensaje que menciona una tubería rota y toda la comunicación posterior parece estar muerta. Pensamientos?
(Relacionado: originalmente usé:
netcat foo.bar.org 4000 < out > in &
pero encontró que bloquea la espera de entrada. Tengo curiosidad por esto también, pero probablemente se aborde mejor en una pregunta separada).
write(stdout): Broken pipe
después (o poco después) de escribir en laout
tubería.También me enfrenté a este problema. El principal problema es
netcat
. Es una gran herramienta, pero cierra la conexión cuando se cierra uno de sus descriptores de archivos de entrada o salida conectados. No hace nada cuando el servidor no está escuchando y se cierra cuando el otro par está cerrado. Siempre que configure el servidor correctamente y mantenga abiertos los descriptores de sus archivos, funcionará. Por ejemplo, probé el siguiente escenario y funcionó muy bien: en una configuración de terminal, un servidor echo (lo configuré como a continuación):ahora en otra terminal configure su conexión de Fifo a su servidor
imprima lo que le envíe el servidor (y manténgalo en funcionamiento, si usa
in
fifo en una aplicación que cierra un extremo al finalizar,netcat
cierra la conexión)y en la misma terminal:
ahora lo que escriba se imprimirá nuevamente (después de presionar Enter). Cerrar este comando también cerrará la conexión.
fuente
netcat -t -l -p 4000 < loopFF | tee loopFF
no causa un ciclo de retroalimentación infinito consigo mismo?netcat
se cerrará cada vez que se cierre una de sus conexiones de red. Si cierra el cliente (que envía una cadena y recibe la misma cadena), elnetcat
servidor también se cerrará. Escribí un código de servidor para mí en este caso que se bifurca para manejar múltiples clientes y reconectarlos.El análisis de Steven Monday me parece bien:
cat
regresa después de su primera escrituraout
porque el quince esempty
. Para evitar eso, la solución es mantener un proceso con el fifo abierto en modo de escritura, el primerocat
en el siguiente ejemplo:(El archivo out-pid es la forma de detener todo:.
kill -9 $(cat out-pid)
)Otro ejemplo aquí .
fuente