与多线输入gawk的双向网络通信

时间:2013-01-14 21:40:00

标签: sockets networking gawk

我正在努力使一个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;
...

但它以完全相同的方式退出。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用GNU netcat,您可以使用-k选项在客户端连接关闭后保持服务器正常运行。请参阅the manual

答案 1 :(得分:0)

回答为什么你的while解决方案不能像你在上面的答案的评论中所说的那样工作,在awk中执行外部命令(command | getline...)要求它们在被再次调用之前被“关闭” (或者这将尝试继续读取原始调用的输出 - 即使进程终止 - )。

您必须检测执行完成的时间(getline什么都不读)并执行close(s)。只有在执行close后,s | getline才会运行该命令的新实例。