【问题标题】:Client doesn't close connection to server after receiving all responses客户端在收到所有响应后未关闭与服务器的连接
【发布时间】:2018-11-04 13:34:00
【问题描述】:

对于一个学校项目,我必须创建一个 bash 脚本,该脚本与远程 netcat 服务器通信并将命令发送到该服务器,并返回响应。

在我的客户端脚本中,我有一个sendMessage 函数,它向服务器发送消息,然后显示来自服务器的响应。我的问题是收到响应后,netcat仍在等待来自服务器的数据,不会关闭连接。

我已经尝试了 -q 参数,但我没有得到我的回应, -w 参数几乎是我想要的,但最小值是 1 秒,这在我的情况下无法使用。

这是我的功能:

function sendMessage {
    netcat -w 1 "$ipAddress" "$port" <<< "$*"
}

我仍在寻找自己的一方,但我不得不承认一点帮助是非常受欢迎的。

【问题讨论】:

  • 你怎么知道你已经收到了服务器的完整响应?
  • 这就是问题所在。 @Zrin 下面的好答案。我将在我自己的类似问题中使用它。

标签: bash netcat


【解决方案1】:

终于找到了一种可行的方法(也许不是最好的,但至少它完美地做到了我想要的:D)

在所有功能之后,我发送一条“ENDRESPONSE”消息,并在我的客户端上测试我是否有此消息:

function sendMessage {
    while read line; do
        if [[ $line == "ENDRESPONSE" ]]; then
            break
        else
            echo $line
        fi
    done < <(netcat "$ipAddress" "$port" <<< "$*")
}

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

【讨论】:

    【解决方案2】:

    你可以exec nc as coproc, 将线路发送到服务器,然后使用read 超时读取响应,检查响应是否完整,然后通过发送关闭连接发信号给nc。

    除了使用nc,您也许还可以使用 bash TCP 功能,例如

    exec 5<>/dev/tcp/"$HOST"/"$PORT"
    read -t "$TIMEOUT" -n "$MAXLEN" line
    exec 5<&- 5>&-
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2019-06-12
      相关资源
      最近更新 更多