메시지 전달은 상위 계층에서 구현해야합니다. TCP에는 메시지 개념이 없습니다. TCP 연결은 옥텟 스트림을 전송합니다.
당신은 당신이 요청하는 것 같은 정렬의 뭔가 얻을 수 있습니다 nc
및 명명 된 파이프 , 참조 man mkfifo
; 또는 socat
Alex Stragies가 나타내는대로 확인하십시오 .
중간 계층 서비스가 없으면 기본 문제는 (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
.