El paso de mensajes debe implementarse en una capa superior; TCP no tiene una noción de mensaje: las conexiones TCP transfieren secuencias de octetos.
Puede lograr algo parecido a lo que solicita nc
y las canalizaciones con nombre , vea man mkfifo
; o verifique socat
como lo indica Alex Stragies.
Sin un servicio de capa intermedia, los problemas básicos son (1) que los datos no pueden escribirse en la red a menos que haya alguien en el otro extremo que lo escuche y (2) que las conexiones TCP son bidireccionales.
Debido a que no puede escribir datos en la red a menos que alguien lo esté escuchando, siempre debe iniciar el escucha antes de poder enviar datos. (En un sistema de paso de mensajes, el proceso que maneja los mensajes proporcionará algún tipo de almacenamiento en búfer).
Su ejemplo puede reescribirse fácilmente:
Primero inicie un oyente en machine2 (el destino):
nc -l 1234 | ...some processing with the received data...
En su ejemplo, esto sería
nc -l 1234 | cat
Esto bloqueará y esperará que alguien envíe algunos datos al puerto 1234.
Luego puede enviar algunos datos de machine1 (la fuente):
...make up some data... | nc machine2 1234
En su ejemplo, esto sería
echo "Hello" | nc machine2 1234
Si desea procesar los datos recibidos de alguna manera y responder, puede usar la función de coprocesamiento del shell. Por ejemplo, este es un servidor web muy simple (y muy terco):
#! /bin/bash
while :; do
coproc ncfd { nc -l 1234; }
while :; do
read line <&${ncfd[0]} || break
line="$(
echo "$line" |
LC_ALL=C tr -cd ' -~'
)"
echo >&2 "Received: \"$line\""
if [ "$line" = "" ]; then
echo >&${ncfd[1]} "HTTP/1.0 200 OK"
echo >&${ncfd[1]} "Content-Type: text/html"
echo >&${ncfd[1]} "Connection: close"
echo >&${ncfd[1]} ""
echo >&${ncfd[1]} "<title>It works!</title>"
echo >&${ncfd[1]} "<center><b>It works!</b></center>"
echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
break
fi
done
kill %%
sleep 0.1
done
Vea cómo se logra la comunicación bidireccional entre el cuerpo principal del script y el coproceso utilizando los descriptores de archivo en la matriz $ncfd
.