TCPを介した安定したファイル転送のためのsocat

TCPを介した安定したファイル転送のためのsocat

私は通常netcatで提起される「スタンバイ - >停止」デザインの欠点を知っています。

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

(これは信頼できません。どれだけ待っているかを測定することはできません。ネットワークのボトルネックが1秒間さらに発生する可能性が常にあります。待たなければならないか!)

私は解決策が欲しい。安定して優れた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には多くのオプションがあります)

答え1

私の考えでは、あなたのコアが信頼できるようです。これは信頼できるもので、ファイルが完全に転送された後に終了する必要があります。

ただし、out.txtこの設定が既に存在する場合は予期せず動作することがあります。out.txt長い場合、socatはファイルが空であることを確認するのではなく、ファイルをバイト単位で上書きするため、test.txt最後の部分が保持されます。out.txt実行したい操作に応じて、この問題を解決する方法はいくつかあります。

  • OPEN:out.txt,creat,truncout.txt書き込み前にすべてのバイトが削除されます。このオプションはあなたの期待に似ており、cpあなたが望むものかもしれません。
  • OPEN:out.txt,creat,exclout.txtすでに存在する場合、書き込みは拒否されます。セキュリティを強化するには、このオプションを使用します。
  • OPEN:out.txt,creat,appendにデータを追加しますout.txt

md5sumこのような極端なケースのため、私はこのようなものを一緒に接続するたびにソースファイルとターゲットファイルで実行するのが好きです。

関連情報