我正在尝试使 gawk 程序充当简单的服务器,绑定(bind)到网络套接字并回答查询。
到目前为止,我的脚本是这样的:
#!/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 绑定(bind)到端口 2345 上的每个本地 IP 地址,但我认为如果我只想绑定(bind)到一个 IP(在多 IP 主机上),我需要使用类似于我所做的事情。另外,当我测试 /inet/tcp/...
符号,我无法让它工作。该脚本将运行,并等待输入,但它似乎没有绑定(bind)到套接字,所以它不会得到任何输入。所以......使用 netcat 替代方案,我的问题是...... 客户端关闭连接后,如何让服务器保持运行?
使用上面的代码,我可以连接并发送多行来获得响应,但是一旦客户端断开连接,服务器也会退出。
我认为这是因为
nc
命令行关闭输入流,从而结束 while 循环,但在我看来,while 循环应该通过重新打开 s
来继续。变量再次作为协同过程。我该如何进行这项工作?如果我可以使用
/inet/tcp/...
,这不是问题吗?符号?我应该将整个 gawk 脚本包装在一个 shell 脚本中,然后在退出时重新运行它吗?或者我应该将内部while循环包装在另一个while循环中吗?或者是其他东西?我尝试用这个替换while循环的调用:
...
while (1) {
s |& getline inp;
print inp;
...
但它以完全相同的方式退出。
谢谢你的帮助。
最佳答案
与 GNU netcat
您可以使用 -k
关闭客户端连接后保持服务器运行的选项。见 the manual .
关于sockets - 带多线输入的gawk双向网络通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327221/