Передача сообщений должна быть реализована на более высоком уровне; TCP не имеет понятия сообщения - TCP-соединения передают потоки октетов.
Вы можете достичь чего-то вроде того, что вы запрашиваете, nc
и именованных каналов , видите man mkfifo
; или проверьте, socat
как указывает Алекс Страгиес.
Без службы среднего уровня основные проблемы заключаются в том, что (1) данные не могут быть записаны в сеть, если на другом конце их не слушают, и (2) соединения TCP являются двунаправленными.
Поскольку вы не можете записывать данные в сеть, если кто-то их не слушает, вы всегда должны запустить прослушиватель, прежде чем сможете отправлять данные. (В системе передачи сообщений процесс, обрабатывающий сообщения, обеспечит некоторую буферизацию.)
Ваш пример может быть легко переписан:
Сначала запустите слушатель на машине 2 (место назначения):
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
.