gawk プログラムを単純なサーバーとして機能させ、ネットワーク ソケットにバインドし、クエリに応答させようとしています。
これまでの私のスクリプトは次のとおりです。
#!/usr/local/bin/gawk
BEGIN {
s="nc -l 10.0.0.21 2345";
while (s |& getline inp) {
print inp;
print "Response to " inp |& s;
}
}
私netcat
が gawk の内部ネットワークの代わりに使用していることにお気付きでしょうか? ドキュメントを読んだところ、理論的には、ポート 2345 のすべてs="/inet/tcp/2345/0/0";
のローカル IP アドレスにgawk をバインドするように設定できるはずですが、(マルチ IP ホスト上で) 1 つの IP だけにバインドしたい場合は、私がやったことのようなものを使用する必要があります。また、表記をテストしたところ、動作しませんでした。スクリプトは実行され、入力を待ちますが、ソケットにバインドされていないように見えたため、入力を取得できませんでした。/inet/tcp/...
それで... netcatの代替が機能している場合、私の質問は...クライアントが接続を閉じた後、サーバーを実行したままにするにはどうすればよいですか?
上記のコードを使用すると、応答を取得する複数の行を接続して送信できますが、クライアントが切断されるとすぐにサーバーも終了します。
これは、コマンドラインが入力ストリームを閉じて while ループを終了するためだと思いますが、変数をコプロセスとしてnc
再度開くことで while ループを続行する必要があるように思えます。s
どうすればこれを機能させることができますか? /inet/tcp/...
表記を使えば問題ないのでしょうか?終了時に再実行するだけのシェルスクリプトで gawk スクリプト全体をラップする必要がありますか? または、内側の while ループを別の while ループでラップする必要がありますか? または、他の何か?
while ループの呼び出しを次のように置き換えてみました。
...
while (1) {
s |& getline inp;
print inp;
...
しかし、それはまったく同じ方法で終了しました。
ご協力いただきありがとうございます。