การส่งผ่านข้อความต้องดำเนินการในระดับที่สูงขึ้น TCP ไม่มีความคิดของข้อความ - การเชื่อมต่อ TCP ถ่ายโอนสตรีมของ octets
คุณสามารถทำสิ่งที่คล้ายกับสิ่งที่คุณร้องขอด้วย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
มาดูกันว่าการสื่อสารแบบสองทิศทางระหว่างเนื้อหาหลักของสคริปต์และตัวประมวลผลร่วมโดยใช้ file descriptors ในอาร์เรย์$ncfd
ได้อย่างไร