Sử dụng các đường ống có tên vào / ra cho kết nối TCP


15

Tôi đã loay hoay với việc này để hoạt động được một thời gian, vì vậy tôi nghi ngờ một số hiểu lầm cơ bản về cách thức hoạt động của đường ống là nguyên nhân gốc rễ của những rắc rối của tôi.

Mục tiêu của tôi là khởi tạo kết nối TCP đến một số máy chủ từ xa thông qua netcatvà có hai đường dẫn được đặt tên trên hệ thống tệp: một đường dẫn có thể đọc từ đó để lấy dữ liệu đến và các đường dẫn khác có thể ghi vào dữ liệu gửi đi. Tôi hiện đang sử dụng các cấu trúc sau:

mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &

Từ đây, tôi muốn cho phép các quá trình khác đọc và ghi vào / từ kết nối TCP mở này. Điều này "chỉ hoạt động", hoặc có một lý do tại sao một cấu trúc như thế này không thể làm việc?

Điều dường như xảy ra hiện tại là tôi có thể đọc outmà không gặp vấn đề gì, nhưng khi tôi viết thư cho intôi nhận được kết quả đề cập đến một đường ống bị hỏng và tất cả các giao tiếp tiếp theo dường như đã chết. Suy nghĩ?

(Liên quan: Ban đầu tôi sử dụng:

netcat foo.bar.org 4000 < out > in &

nhưng tìm thấy nó để chặn chờ đầu vào. Tôi cũng tò mò về điều này, nhưng có lẽ nó được giải quyết tốt hơn trong một câu hỏi riêng.)

Câu trả lời:


6
cat out | netcat foo.bar.org 4000 > in &

Tôi nghĩ vấn đề là nó catsẽ thoát ra ngay khi nhận được EOFtừ outđường ống. Và khi catthoát ra, phần còn lại của đường ống (bao gồm netcat) cũng bị chấm dứt.

Thay vào đó hãy thử một cái gì đó như thế này:

while true; do cat out; done | netcat foo.bar.org 4000 > in &

Do đó, catđược khởi động lại thường xuyên khi cần thiết và bất kỳ EOFs nào xuất hiện trong outđường ống đều được xử lý hiệu quả.


Tôi đã thử điều này, nhưng vẫn nhận được write(stdout): Broken pipesau (hoặc ngay sau đó) viết vào outđường ống.
noffle

2

Tôi đã phải đối mặt với vấn đề này quá. Vấn đề chính là netcat. Nó là một công cụ tuyệt vời, nhưng nó đóng kết nối khi một trong những mô tả tập tin đầu vào hoặc đầu ra được kết nối của nó được đóng lại. Nó không làm gì khi máy chủ không nghe và nó thoát khi đóng ngang hàng khác. Miễn là bạn thiết lập máy chủ chính xác và giữ cho bộ mô tả tệp của bạn mở, nó sẽ hoạt động. Ví dụ, tôi đã thử nghiệm kịch bản sau đây và nó hoạt động rất tốt: trong thiết lập đầu cuối, máy chủ echo (tôi thiết lập nó như bên dưới):

mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF

bây giờ trong một thiết bị đầu cuối khác thiết lập kết nối fifo của bạn với máy chủ của bạn:

mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &

in ra bất cứ thứ gì máy chủ gửi cho bạn (và giữ cho nó chạy, nếu bạn sử dụng infifo trong một ứng dụng đóng một đầu khi kết thúc, hãy netcatđóng kết nối)

cat in &

và trong cùng một thiết bị đầu cuối:

cat > out

bây giờ bất cứ điều gì bạn gõ sẽ được in lại (sau khi nhấn Enter). Đóng lệnh này cũng sẽ đóng kết nối.


Tôi có thể thấy rằng đó không phải là trường hợp khi tôi tự mình thử, nhưng tại sao nó netcat -t -l -p 4000 < loopFF | tee loopFFkhông gây ra một vòng phản hồi vô hạn với chính nó?
noffle

@noffle bởi vì, như tôi đã nói, netcatsẽ đóng bất cứ khi nào một trong các kết nối mạng của nó đóng lại. Nếu bạn đóng máy khách (sẽ gửi một chuỗi và nhận cùng một chuỗi), netcatmáy chủ cũng sẽ bị đóng. Tôi đã tự viết mã máy chủ trong trường hợp này để tự xử lý nhiều máy khách và kết nối lại máy khách.
saeedn

2

Phân tích của Steven Thứ Hai có vẻ tốt với tôi: cattrở lại sau lần viết đầu tiên của bạn outbởi vì fifo là empty. Để tránh điều đó, giải pháp là giữ một quá trình với fifo được mở ở chế độ ghi, lần đầu tiên cattrong ví dụ dưới đây:

mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &

(Tệp out-pid là cách để ngăn chặn toàn bộ : kill -9 $(cat out-pid).)

Một ví dụ khác ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.