bash ncat / nc / netcat连接不会关闭/保持打开时间太长

问题描述 投票:1回答:1

我将Ubuntu 18.04 LTSbash 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选项有一些缺点。

  1. [也许一秒钟过长。连接应该只需要约150毫秒,并且等待剩下的一秒会使每个客户端减速,即使它已经有了答案。而且-正如我之前所说的-客户要做的事!客户在得到答案后不应浪费时间!

  2. [不良行为者恶意客户端可以连接到无意及时关闭服务器的服务器,我希望服务器能够更好地控制并关闭不良行为者。

  3. 也许一秒钟太短。 atc-worker.sh具有一种机制,等待有一个锁定文件被删除。如果该锁定文件超过一秒钟,则连接将关闭,客户端才能收到响应。

可能的解决方案。

  1. atc-worker.sh脚本可以发送魔术字符集来终止连接。问题已解决。
  2. 在客户端解决方案集上,也许curl代替nc是合适的选择?但这并不能解决我对能够与坏演员打交道的担忧。也许这是两个不同的问题?客户端在收到答案后立即关闭连接,服务器端与将使用他们选择的客户端的不良行为者打交道。
  3. 也许使用expect?我正在对此进行调查。

提前感谢!

bash client-server netcat
1个回答
0
投票

确定。经过大量的挖掘,我发现其他人也遇到类似的问题。这是他的答案的链接。

原始问题: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" <<< "$*")
}

无论如何感谢您的帮助,我稍后将尝试实现其他解决方案!

© www.soinside.com 2019 - 2024. All rights reserved.