socat chuyển tập tin đáng tin cậy qua TCP


8

Tôi nhận thức được những nhược điểm của thiết kế "chờ-> dừng", thường được đề xuất với netcat:

server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat

(Điều đó không đáng tin cậy: không có bao lâu bạn chờ đợi, luôn có thể xảy ra tình trạng tắc nghẽn mạng trong một giây nữa. - Một điều nữa -> tại sao phải đợi 10 giây nếu bạn có thể biết ngay rằng dữ liệu được truyền và bắt đầu xử lý chúng!)

Tôi muốn giải pháp, với việc đóng luồng tcp đáng tin cậy và tốt đẹp .

Tôi đã tìm thấy socat, với việc đóng cửa như được mô tả trong man socat:

Khi một trong các luồng đạt hiệu quả EOF, giai đoạn kết thúc bắt đầu. Socat chuyển điều kiện EOF sang luồng khác, tức là cố gắng chỉ tắt luồng ghi của nó, cho nó cơ hội chấm dứt một cách duyên dáng.

Tôi tìm thấy các lệnh sau làm việc:

Máy chủ gửi tập tin:

server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat

Máy chủ nhận tệp:

server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876

Có đáng tin cậy không? Nó có thể được cải thiện? (Tôi đã sử dụng đúng tùy chọn chưa? Có tùy chọn nào tốt hơn để thiết lập không? - Có rất nhiều trong số chúng có socat)


Đối với người theo dõi, ví dụ thứ hai ("máy chủ nhận tệp") có ứng dụng khách "điển hình" gửi tệp đến máy chủ ... các phiên bản mới hơn của netcat có tùy chọn "-N -q 0" sẽ dẫn đến độ tin cậy cao hơn chuyển giao hơn so với cơ chế "chờ đợi và hy vọng" cũ :)
rogerdpack

Câu trả lời:


6

Có vẻ như tôi là cốt lõi của bạn là vững chắc - điều này đáng tin cậy và nên thoát khi tệp đã được gửi hoàn toàn.

out.txtTuy nhiên, nếu đã tồn tại, thì thiết lập này có thể hoạt động không giới hạn. Nếu out.txtdài hơn test.txt, phần cuối cùng out.txtsẽ vẫn còn, vì socat đang ghi đè byte tệp theo byte thay vì đảm bảo tệp trống. Có một số cách để khắc phục điều này, tùy thuộc vào những gì bạn muốn làm:

  • OPEN:out.txt,creat,truncsẽ xóa tất cả các byte trong out.txttrước khi ghi vào nó. Tùy chọn này bắt chước những gì bạn mong đợi cpvà có thể là những gì bạn muốn.
  • OPEN:out.txt,creat,exclsẽ từ chối viết out.txtnếu nó đã tồn tại. Sử dụng tùy chọn này để thêm an toàn.
  • OPEN:out.txt,creat,appendsẽ nối thêm dữ liệu vào out.txt.

Tôi cũng thích chạy md5sumtrên các tệp nguồn và đích bất cứ khi nào tôi kết hợp một cái gì đó như thế này với nhau, vì những trường hợp góc này.


thật tuyệt vời khi bạn đề cập đến "trunc" và những trường hợp cạnh đó. Còn md5sum thì sao, trong trường hợp của tôi, đó là vấn đề khiến tôi cần chuyển tất cả mọi thứ mà không đóng kết nối ("one-shot";)). Ngay cả bạn, thật tốt khi đề cập đến những độc giả khác :).
Grzegorz Wierzowiecki
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.