Saya menyadari kekurangan dari desain "wait-> stop", yang biasanya diusulkan dengan netcat:
server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat
(Ini tidak dapat diandalkan: tidak ada meter berapa lama Anda menunggu selalu ada kemungkinan kemacetan jaringan untuk satu detik lebih lama. - Satu hal lagi -> mengapa menunggu 10 detik jika Anda dapat segera mengetahui bahwa data ditransfer dan mulai memprosesnya!)
Saya ingin solusi, dengan penutupan aliran tcp yang andal dan menyenangkan .
Saya telah menemukan socat, dengan penutup seperti yang dijelaskan dalam man socat
:
Ketika salah satu aliran secara efektif mencapai EOF, fase penutupan dimulai. Socat mentransfer kondisi EOF ke aliran lain, yaitu mencoba mematikan hanya aliran tulisnya, memberikannya kesempatan untuk mengakhiri dengan anggun.
Saya menemukan perintah berikut berfungsi:
Server mengirim file:
server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
Server menerima file:
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
Apakah ini dapat diandalkan? Bisakah ini diperbaiki? (Sudahkah saya menggunakan opsi yang tepat? Apakah ada opsi yang lebih baik untuk setup? - Ada begitu banyak dari mereka dengan socat)
sumber
Jawaban:
Menurut saya inti Anda solid - ini harus dapat diandalkan, dan harus berhenti setelah file telah sepenuhnya dikirim.
Namun, jika
out.txt
sudah ada, maka pengaturan ini mungkin berperilaku tidak terduga. Jikaout.txt
lebih lama daritest.txt
, bagian terakhirout.txt
akan tetap ada, karena socat menimpa file byte demi byte alih-alih memastikan file kosong. Ada beberapa cara untuk memperbaikinya, tergantung pada apa yang ingin Anda lakukan:OPEN:out.txt,creat,trunc
akan menghapus semua byteout.txt
sebelum menulis. Opsi ini meniru apa yang Anda harapkan daricp
, dan mungkin itu yang Anda inginkan.OPEN:out.txt,creat,excl
akan menolak untuk menulisout.txt
jika sudah ada. Gunakan opsi ini untuk keamanan ekstra.OPEN:out.txt,creat,append
akan menambahkan data keout.txt
.Saya juga suka menjalankan
md5sum
pada sumber dan tujuan file setiap kali saya cobble sesuatu seperti ini bersama-sama, karena ini semacam kasus sudut.sumber