Я пытаюсь отправить сообщение через netcat
. После отправки сообщения, netcat
необходимо прекратить.
Я пробовал следующее:
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
В -q
опции говорится:
-q секунд
после EOF на stdin, подождите указанное количество секунд и затем выйдите. Если секунды отрицательны, ждите вечно.
Но
nc -q0 -u localhost 4300 < message.bin
тоже не работает.
Что мне не хватает?
-q
.invalid wait-time 0
Без
-q
флага ваш экземплярnetcat
будет ждать вечно. В UDP нет сообщения «конец потока», поэтому нет возможностиnetcat
узнать, что и stdin, и сетевое соединение завершены.Например, при использовании TCP / IP это работает как ожидалось:
Но, как вы определили, использование UDP / IP никогда не заканчивается:
Это где
-q
флаг входит. Но, к сожалению, он не принимает значение0
. Это также не будет принимать нецелые значения. Вот лучшая альтернатива, которую я могу предложить, не прибегая кtimeout
какой-либо внешней утилите:Даже здесь невозможно
netcat
изящно провести время прослушивания . (Параметр-w
тайм-аута игнорируется и не-q
имеет значения.) Нечто подобное может быть полезно в практической ситуации, так что егоnetcat
убивают через 90 секунд:источник
-q 0
работает для меня.УДП
ТСР
источник
Наткнулся на это, когда гуглил по поводу примерно такой же проблемы. Выяснилось, что проблема заключалась в том, что netcat был убит bash сразу после того, как все данные были засосаны, без какого-либо шанса получить ответ.
Моим решением было добавить задержку после передачи данных, например:
С файлом это может выглядеть так:
источник
netcat
все еще не закрывается, когдаsleep
заканчивается. Я ожидаю, что первая командная строка вернется к приглашению через 1 секунду, но это не так.-q 1
? то есть(echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379
?-q
всем работает, даже пример в моем оригинальном вопросе. С тех пор я перешел на более новую версию Ubuntu, возможно, в этом и заключается разница.