Das Weiterleiten von Nachrichten muss auf einer höheren Ebene implementiert werden. TCP hat keine Vorstellung von einer Nachricht - die TCP-Verbindungen übertragen Oktettströme.
Sie können so etwas wie das erreichen, was Sie mit nc
und benannten Pipes anfordern , siehe man mkfifo
; oder überprüfen Sie, socat
wie Alex Stragies angibt.
Ohne einen Middle-Layer-Dienst bestehen die Grundprobleme darin, (1) dass Daten nur dann in das Netzwerk geschrieben werden können, wenn jemand am anderen Ende darauf wartet, und (2) dass TCP-Verbindungen bidirektional sind.
Da Sie keine Daten in das Netzwerk schreiben können, ohne dass jemand darauf wartet, müssen Sie den Listener immer starten, bevor Sie Daten senden können. (In einem Nachrichtenübermittlungssystem stellt der Prozess, der die Nachrichten verarbeitet, eine Art Pufferung bereit.)
Ihr Beispiel kann einfach umgeschrieben werden:
Starten Sie zuerst einen Listener auf Maschine2 (dem Ziel):
nc -l 1234 | ...some processing with the received data...
In Ihrem Beispiel wäre dies
nc -l 1234 | cat
Dies blockiert und wartet darauf, dass jemand Daten an Port 1234 sendet.
Dann können Sie einige Daten von Maschine1 (der Quelle) senden:
...make up some data... | nc machine2 1234
In Ihrem Beispiel wäre dies
echo "Hello" | nc machine2 1234
Wenn Sie die empfangenen Daten auf irgendeine Weise verarbeiten und antworten möchten, können Sie die Coprozessierungsfunktion der Shell verwenden. Dies ist beispielsweise ein sehr einfacher (und sehr hartnäckiger) Webserver:
#! /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
Sehen Sie anhand der Dateideskriptoren im Array, wie die bidirektionale Kommunikation zwischen dem Hauptteil des Skripts und dem Coprozess erreicht wird $ncfd
.