1

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;
...

しかし、それはまったく同じ方法で終了しました。

ご協力いただきありがとうございます。

4

2 に答える 2

2

GNUnetcatでは、オプションを使用-kして、クライアント接続が閉じられた後もサーバーを実行し続けることができます。マニュアルを参照してください。

于 2013-01-14T22:18:39.780 に答える
0

while上記の回答のコメントで尋ねたようにソリューションが機能しない理由に答えるcommand | getline...と、awk で外部コマンド ( ) を実行するには、再度呼び出す前にそれらを「閉じる」必要があります (または、元のコマンドからの出力の読み取りを続行しようとします)。呼び出し -- プロセスが死んでも --)。

実行がいつ終了するか (getline は何も読み取らない) を検出し、close(s). closeを実行した後でのみs | getline、コマンドの新しいインスタンスが実行されます。

于 2015-02-18T16:23:43.907 に答える