私は通常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,trunc
out.txt
書き込み前にすべてのバイトが削除されます。このオプションはあなたの期待に似ており、cp
あなたが望むものかもしれません。OPEN:out.txt,creat,excl
out.txt
すでに存在する場合、書き込みは拒否されます。セキュリティを強化するには、このオプションを使用します。OPEN:out.txt,creat,append
にデータを追加しますout.txt
。
md5sum
このような極端なケースのため、私はこのようなものを一緒に接続するたびにソースファイルとターゲットファイルで実行するのが好きです。