socat transfer file yang dapat diandalkan melalui TCP

8

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)

Grzegorz Wierzowiecki
sumber
Untuk pengikut, contoh kedua ("server menerima file") ada klien "khas" mengirim file ke server ... juga versi netcat yang lebih baru memiliki opsi "-N -q 0" yang akan menghasilkan lebih dapat diandalkan transfer daripada mekanisme lama "menunggu dan berharap" :)
rogerdpack

Jawaban:

6

Menurut saya inti Anda solid - ini harus dapat diandalkan, dan harus berhenti setelah file telah sepenuhnya dikirim.

Namun, jika out.txtsudah ada, maka pengaturan ini mungkin berperilaku tidak terduga. Jika out.txtlebih lama dari test.txt, bagian terakhir out.txtakan 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,truncakan menghapus semua byte out.txtsebelum menulis. Opsi ini meniru apa yang Anda harapkan dari cp, dan mungkin itu yang Anda inginkan.
  • OPEN:out.txt,creat,exclakan menolak untuk menulis out.txtjika sudah ada. Gunakan opsi ini untuk keamanan ekstra.
  • OPEN:out.txt,creat,appendakan menambahkan data ke out.txt.

Saya juga suka menjalankan md5sumpada sumber dan tujuan file setiap kali saya cobble sesuatu seperti ini bersama-sama, karena ini semacam kasus sudut.

Jander
sumber
itu bagus Anda telah menyebutkan tentang "trunc" dan kasus tepi itu. Bagaimana dengan md5sum, dalam kasus saya ini masalah karena saya harus mentransfer semua barang tanpa menutup koneksi ("one-shot";)). Bahkan Engkau, itu baik untuk disebutkan untuk pembaca lain :).
Grzegorz Wierzowiecki