bash-ncat/nc/netcat连接赢得';t关闭/保持打开的时间过长

bash-ncat/nc/netcat连接赢得';t关闭/保持打开的时间过长,bash,client-server,netcat,Bash,Client Server,Netcat,我使用的是ubuntu18.04lts和bash4.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 在客户机上,我正在这样做: ncat -l 2001 -k -c 'xargs -n1 ./atc-worker.sh' echo "

我使用的是
ubuntu18.04lts
bash4.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
在客户机上,我正在这样做:

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
功能来回答客户机的请求,但我需要客户机在收到响应后停止侦听,继续他们的其他工作

是否有一个EOF信号/字符可以从我的
atc worker.sh
脚本发送,它会告诉客户端的
nc
断开连接

在客户端上,我使用
-w1
选项告诉客户端连接不超过一秒钟

但是这个
-w1
选项有一些缺点

  • 可能一秒钟太长。连接只需约150毫秒,等待一秒钟的剩余时间会减慢每个客户端的速度,即使它已经有了答案。而且——正如我之前所说的——客户有杂务要做!客户在得到答案后不应该浪费时间

  • 坏角色恶意客户端可以连接到无意及时关闭的服务器,我希望服务器能够更好地控制和关闭坏角色

  • 可能一秒钟太短。
    atc worker.sh
    有一种机制,可以在存在锁文件时等待将其删除。如果该锁文件在那里的时间超过一秒钟,则连接将在客户端接收其响应之前关闭

  • 可能的解决方案。

  • atc worker.sh
    脚本可以发送一个魔术字符集来终止连接。问题解决了
  • 在客户端解决方案集上,也许
    curl
    将是一个合适的选择,而不是
    nc
    ?但这并不能解决我对能够对付坏演员的担忧。也许这是两个不同的问题?客户端在收到应答后立即关闭连接,而服务器端则处理将使用所选客户端的坏角色
  • 可能使用
    expect
    ?我现在正在调查

  • 提前谢谢

    好的。经过大量的挖掘,我发现其他人也有类似的问题。以下是他的答案的链接

    原始问题:

    原始答复:

    谢谢@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" <<< "$*")
    }
    
    函数发送消息{
    边读边做
    如果[[$line==“ENDRESPONSE”];则
    打破
    其他的
    回音$线
    fi
    
    完成<好的。经过大量挖掘,我发现其他人也有类似的问题。这是他的答案的链接

    原始问题:

    原始答复:

    谢谢@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" <<< "$*")
    }
    
    函数发送消息{
    边读边做
    如果[[$line==“ENDRESPONSE”];则
    打破
    其他的
    回音$线
    fi
    
    完成netcat
    有此选项:“-N关闭(2)输入端EOF后的网络套接字。某些服务器需要此选项来完成其工作。”我不知道
    ncat
    有任何等效选项。BSD
    netcat
    有此选项:“-N关闭(2)输入上的EOF之后的网络套接字。某些服务器需要此套接字来完成其工作。“我不知道
    ncat
    有任何等效项。