Le passage de messages doit être implémenté à une couche supérieure; TCP n'a pas la notion de message - les connexions TCP transfèrent des flux d'octets.
Vous pouvez obtenir quelque chose de tri comme ce que vous demandez avec nc
et les pipes nommés , voir man mkfifo
; ou vérifiez socat
comme Alex Stragies l'indique.
Sans service de couche intermédiaire, les problèmes de base sont (1) que les données ne peuvent pas être écrites sur le réseau à moins qu'il n'y ait quelqu'un à l'autre bout pour les écouter, et (2) que les connexions TCP soient bidirectionnelles.
Parce que vous ne pouvez pas écrire de données sur le réseau à moins que quelqu'un ne les écoute, vous devez toujours démarrer l'écouteur avant de pouvoir envoyer des données. (Dans un système de transmission de messages, le processus qui gère les messages fournira une sorte de tampon.)
Votre exemple peut être facilement réécrit:
Démarrez d'abord un écouteur sur machine2 (la destination):
nc -l 1234 | ...some processing with the received data...
Dans votre exemple, ce serait
nc -l 1234 | cat
Cela bloquera et attendra que quelqu'un envoie des données au port 1234.
Ensuite, vous pouvez envoyer des données de machine1 (la source):
...make up some data... | nc machine2 1234
Dans votre exemple, ce serait
echo "Hello" | nc machine2 1234
Si vous souhaitez traiter les données reçues d'une manière et répondre, vous pouvez utiliser la fonction de coprocessing du shell. Par exemple, il s'agit d'un serveur Web très simple (et très têtu):
#! /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
Découvrez comment la communication bidirectionnelle est réalisée entre le corps principal du script et le coprocessus à l'aide des descripteurs de fichiers du tableau $ncfd
.