Клиент не закрывает соединение с сервером после получения всех ответов - PullRequest
0 голосов
/ 25 мая 2018

Для школьного проекта мне нужно создать bash-скрипт, который связывается с удаленным сервером netcat, отправляет команды этому серверу и возвращает ответы.

В моем клиентском скрипте у меня есть sendMessage функция, которая отправляет сообщения на сервер, а затем отображает ответ от сервера.Моя проблема в том, что после получения ответа netcat по-прежнему ожидает данные с сервера и не закрывает соединение.

Я уже пробовал аргумент -q и не получаю с ним ответов,аргумент -w - почти то, что я хочу, но минимальное значение составляет 1 секунду, что невозможно использовать в моем случае.

Вот моя функция:

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

I 'Я все еще ищу на моей стороне, но я должен признать, что небольшая помощь будет очень кстати.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Наконец-то нашел рабочий способ (может быть, не самый лучший, но, по крайней мере, он отлично делает то, что я хочу: D)

после всех функций я отправляю сообщение "ENDRESPONSE", и на своем клиенте я проверяю,У меня есть это сообщение или нет:

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

В любом случае, спасибо за вашу помощь, я постараюсь реализовать другие решения позже!

0 голосов
/ 25 мая 2018

Вы можете exec nc как coproc, отправить линию на сервер, затем использовать read с таймаутом для чтения ответа, проверить, завершен ли ответ, а затем закрыть соединение, отправивсигнал nc.

Вместо использования nc вы, возможно, также можете использовать возможности bash TCP, например

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