Truyền tin cần được thực hiện ở lớp cao hơn; TCP không có khái niệm về một thông điệp - các kết nối TCP truyền các luồng của octet.
Bạn có thể đạt được một cái gì đó giống như những gì bạn yêu cầu nc
và đặt tên ống , xem man mkfifo
; hoặc kiểm tra socat
như Alex Stragies chỉ ra.
Nếu không có dịch vụ lớp giữa, các vấn đề cơ bản là (1) dữ liệu không thể được ghi vào mạng trừ khi có ai đó ở đầu bên kia lắng nghe và (2) các kết nối TCP là hai chiều.
Vì bạn không thể ghi dữ liệu vào mạng trừ khi có ai đó lắng nghe, bạn phải luôn khởi động người nghe trước khi bạn có thể gửi dữ liệu. (Trong một hệ thống chuyển tin nhắn, quá trình xử lý các tin nhắn sẽ cung cấp một số loại bộ đệm.)
Ví dụ của bạn có thể dễ dàng viết lại:
Đầu tiên bắt đầu một trình nghe trên machine2 (đích):
nc -l 1234 | ...some processing with the received data...
Trong ví dụ của bạn, điều này sẽ là
nc -l 1234 | cat
Điều này sẽ chặn và chờ ai đó gửi một số dữ liệu tới cổng 1234.
Sau đó, bạn có thể gửi một số dữ liệu từ machine1 (nguồn):
...make up some data... | nc machine2 1234
Trong ví dụ của bạn, điều này sẽ là
echo "Hello" | nc machine2 1234
Nếu bạn muốn xử lý dữ liệu nhận được theo một cách nào đó và phản hồi, bạn có thể sử dụng phương tiện đồng xử lý của trình bao. Ví dụ: đây là một máy chủ web rất đơn giản (và rất cứng đầu):
#! /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
Xem cách đạt được giao tiếp hai chiều giữa phần chính của tập lệnh và bộ đồng xử lý bằng cách sử dụng các bộ mô tả tệp trong mảng $ncfd
.