我将Ubuntu 18.04 LTS
与bash 4.4.20
一起使用。
我正在尝试创建一个小的守护程序来调度线程之间的数据传输。
在服务器上,我正在这样做:
ncat -l 2001 -k -c 'xargs -n1 ./atc-worker.sh'
在客户端上,我正在这样做:
echo "totally-legit-login-token" | nc 127.0.0.1 2001 -w 1
而且效果很好!
以下是回复:
LaunchCode=1589323120.957093305 = Now=1589323120.957093305 = URL=https://totally-legit-url.com/ = AuthToken=totally-legit-auth-token = LastID=167
[当服务器收到来自客户端的请求时,它将调用我的小atc-worker.sh
脚本。服务器吐出一行文本,然后又恢复正常运行,为其他客户端提供服务。
由于-k
选项,服务器将连续监听。多个客户端可以同时连接。唯一的问题是,我无法以编程方式结束连接。我需要服务器上的守护程序-k
功能来回答来自客户端的请求,但是我需要客户端在收到响应后退出侦听并继续他们的其他工作。
是否可以从我的atc-worker.sh
脚本发送EOF信号/字符,该信号告诉客户端的nc
断开连接?
在客户端上,我使用-w 1
选项告诉客户端连接不超过一秒钟。
但是此-w 1
选项有一些缺点。
[也许一秒钟过长。连接应该只需要约150毫秒,并且等待剩下的一秒会使每个客户端减速,即使它已经有了答案。而且-正如我之前所说的-客户要做的事!客户在得到答案后不应浪费时间!
[不良行为者恶意客户端可以连接到无意及时关闭服务器的服务器,我希望服务器能够更好地控制并关闭不良行为者。
也许一秒钟太短。 atc-worker.sh
具有一种机制,等待有一个锁定文件被删除。如果该锁定文件超过一秒钟,则连接将关闭,客户端才能收到响应。
可能的解决方案。
atc-worker.sh
脚本可以发送魔术字符集来终止连接。问题已解决。curl
代替nc
是合适的选择?但这并不能解决我对能够与坏演员打交道的担忧。也许这是两个不同的问题?客户端在收到答案后立即关闭连接,服务器端与将使用他们选择的客户端的不良行为者打交道。expect
?我正在对此进行调查。提前感谢!
确定。经过大量的挖掘,我发现其他人也遇到类似的问题。这是他的答案的链接。
原始问题:Client doesn't close connection to server after receiving all responses
原始答案:https://stackoverflow.com/a/50528286/3055756
感谢@Unyxos
我修改了守护程序以在完成时发送“ ENDRESPONSE”行,即使它没有断开连接。我修改了客户端以查找“ ENDRESPONSE”行。当客户端接听电话时,它将使用@Unyxos在其答案中使用的以下逻辑断开连接。
这是他简单而优雅的答案:
最后找到了一种可行的方法(也许不是最好的方法,但至少它可以完美地完成我想要的:D)
在所有功能之后,我都会发送“ ENDRESPONSE”消息,并在客户端上测试是否有此消息:
function sendMessage {
while read line; do
if [[ $line == "ENDRESPONSE" ]]; then
break
else
echo $line
fi
done < <(netcat "$ipAddress" "$port" <<< "$*")
}
无论如何感谢您的帮助,我稍后将尝试实现其他解决方案!