TCP経由のsocat信頼性の高いファイル転送


8

私は、通常netcatで提案されている「待機->停止」設計の欠点を認識しています。

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

(信頼性はありません:1秒以上ネットワークのボトルネックが発生した可能性があるので、どれほど長く待つこともできません。-別のこと->データが転送されたことがすぐにわかり、処理を開始できる場合は、10秒待つ必要があります。)

信頼性が高く素晴らしいtcpストリームを閉じるソリューションを希望します

私はsocatを見つけましたman socat

ストリームの1つが事実上EOFに到達すると、クローズフェーズが始まります。SocatはEOF状態を他のストリームに転送します。つまり、書き込みストリームのみをシャットダウンしようとし、正常に終了する機会を与えます。

次のコマンドが機能していることがわかりました。

サーバー送信ファイル:

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

サーバー受信ファイル:

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

信頼できますか?改善できますか?(私は正しいオプションを使用しましたか?設定するためのより良いオプションはありますか?-socatにはそれらの多くがあります)


フォロワーの場合、2番目の例(「サーバー受信ファイル」)には、「通常の」クライアントがファイルをサーバーに送信します。また、netcatの新しいバージョンには、「-N -q 0 "オプションがあり、より信頼性が高くなります。古い「待機と希望」メカニズムよりも転送:)
rogerdpack '28

回答:


6

あなたのコアはしっかりしているように見えます-これは信頼できるはずで、ファイルが完全に送信されると終了するはずです。

out.txtただし、すでに存在している場合、この設定は予期しない動作をする可能性があります。場合out.txtよりも長いtest.txt、の最後の部分は、out.txtsocatに関するバイトで、ファイルのバイトを上書きする代わりに、ファイルが空であることを確認することされているので、残ります。これを修正するには、何をしたいかによって、いくつかの方法があります。

  • OPEN:out.txt,creat,truncout.txt書き込む前にすべてのバイトを削除します。このオプションは、あなたが期待するものを模倣しておりcp、おそらくあなたが望むものです。
  • OPEN:out.txt,creat,exclout.txt既に存在する場合、書き込みを拒否します。安全性を高めるには、このオプションを使用してください。
  • OPEN:out.txt,creat,appendにデータを追加しますout.txt

またmd5sum、このようなコーナーケースのため、このようなことを一緒に実行するときはいつでも、ソースファイルと宛先ファイルで実行することも好きです。


「trunc」とそのエッジケースについて述べたのは素晴らしいことです。md5sumについてはどうですか、私の場合、問題を引き起こしているため、接続を閉じずにすべてのものを転送する必要があります( "ワンショット";))。あなたでも、他の読者のために言及するのは良いことです:)。
Grzegorz Wierzowiecki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.