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 的内部网络吗?根据我对文档的阅读,理论上我应该能够设置s="/inet/tcp/2345/0/0";gawk 绑定到端口 2345 上的每个本地 IP 地址,但我认为如果我只想绑定到一个 IP(在多 IP 主机上),我需要使用像我所做的那样的东西。此外,当我测试/inet/tcp/...符号时,我无法让它工作。该脚本将运行,并等待输入,但它似乎没有绑定到套接字,所以它不会得到任何输入。

所以......随着netcat替代品的工作,我的问题是......在客户端关闭连接后,我如何让服务器保持运行?

使用上面的代码,我可以连接并发送多行来获得响应,但是一旦客户端断开连接,服务器也会退出。

我认为这是因为nc命令行关闭了输入流,从而结束了 while 循环,但在我看来,while 循环应该只是通过重新打开s变量作为协同进程来继续。

我该如何进行这项工作?如果我可以使用/inet/tcp/...符号,这不是问题吗?我应该将整个 gawk 脚本包装在一个 shell 脚本中,然后在退出时重新运行它吗?或者我应该将内部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 回答