Повідомлення потрібно реалізувати на більш високому рівні; TCP не має поняття повідомлення - TCP-з'єднання передають потоки октетів.
Ви можете домогтися чогось подібного до того, що ви запитуєте nc
і назвали труби , див man mkfifo
. або перевірте, socat
як вказує Алекс Страгі.
Без сервісу середнього рівня основними проблемами є (1) те, що дані не можна записувати в мережу, якщо хтось на іншому кінці не прослуховує її, і (2), що з'єднання TCP мають двонаправлений характер.
Оскільки ви не можете записувати дані в мережу, якщо хтось не слухає їх, ви завжди повинні запускати слухача, перш ніж ви зможете надсилати дані. (У системі передачі повідомлень процес обробки повідомлень забезпечить певний тип буферизації.)
Ваш приклад можна легко переписати:
Спочатку запустіть слухача на machine2 (пункт призначення):
nc -l 1234 | ...some processing with the received data...
У вашому прикладі це було б
nc -l 1234 | cat
Це заблокує і чекатиме, коли хтось надішле деякі дані до порту 1234
Тоді ви можете надіслати деякі дані з machine1 (джерело):
...make up some data... | nc machine2 1234
У вашому прикладі це було б
echo "Hello" | nc machine2 1234
Якщо ви хочете якимось чином обробити отримані дані та відповісти, ви можете скористатися засобом оброблення оболонки. Наприклад, це дуже простий (і дуже впертий) веб-сервер:
#! /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
Подивіться, як досягається двонаправлена комунікація між основним кодом сценарію та копроцесом за допомогою дескрипторів файлів у масиві $ncfd
.