13

Я думаю, это близко к Linux - Netcat перестает слушать UDP-трафик - Super User, но я подумал, что лучше спросить в любом случае

Что касается версий netcat, я использую Ubuntu 11.04 и используемую по умолчанию netcat , которая, как я предполагаю, является openbsd :

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Вот что я нахожу странным: первый случай работает как положено - я открываю сервер UDP в одном терминале:

$ sudo nc -ul 5000

... и в другом терминале я инициирую новое соединение с UDP-клиентом и трижды hello , нажимая клавишу ВВОД после каждого:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... и возвращаясь к серверному терминалу, он напечатал hello три раза, как и ожидалось:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Пока все хорошо, все работает как положено. Однако, допустим, я сейчас пытаюсь сделать то же самое, передавая данные в клиент; поэтому сначала установите UDP-сервер в одном терминале:

$ sudo nc -ul 5000

... а в другом, направить некоторые данные в nc как UDP-клиент:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... после команды клиента оболочка как бы зависает, как будто ожидает ввода - поэтому я hello и еще два раза ENTER; но сервер зарегистрировал только первый hello (который был передан через echo). Кроме того, даже если вы нажмете Ctrl-C, и попытаетесь повторить клиент echo hello | Команда echo hello | nc -u 127.0.0.1 5000 , сервер по- прежнему останется включенным, сообщив только самый первый hello:

$ sudo nc -ul 57130 
hello
^C

... и только после остановки сервера с помощью Ctrl-C и его повторного запуска можно повторить клиент echo hello | nc -u 127.0.0.1 5000 и наблюдайте, как она работает.

 

Это способ, которым nc должен себя вести? Я ожидаю, что хотя бы повторные звонки на echo hello | nc -u 127.0.0.1 5000 будет зарегистрирован - без перезагрузки сервера? Или, может быть, есть специальный переключатель командной строки для такого поведения?

РЕДАКТИРОВАТЬ: я нашел эту хорошую презентацию PDF: socat - Обработка всех видов сокетов, которая содержит следующие примечания netcat против socat :

netcat - ограничения
● только один выстрел (заканчивается после закрытия гнезда)
...
Примеры 1: замена netcat
...
● UDP-клиент с портом источника:
nc -u -p 500 1.2.3.4 500
сокат - удп: 1.2.3.4: 500, sp = 500
● TCP-сервер:
нк-л-р 8080
socat - tcp-l: 8080, reuseaddr
...

... однако я получаю то же поведение, что и выше, если я заменю команду сервера на « socat - udp4-listen:5000,reuseaddr » - и строку клиента на « socat - udp:127.0.0.1:5000 "... С помощью переданного по каналу ввода « echo hello | socat - udp:127.0.0.1:5000 » единственное отличие состоит в том, что здесь команда существует, по крайней мере, после того, как слово hello было отправлено - однако, опять же, последовательные запуски этой команды не будут вызвать любой прием на сервере, пока сервер не будет перезапущен.

3 ответа3

19

Хорошо, я думаю, что по крайней мере я получил кое-что с socat а именно, параметр fork должен быть добавлен к строке сервера:

$ socat - udp4-listen:5000,reuseaddr,fork

... а затем, в другом терминале, мы можем несколько раз вызвать командную строку echo piping в клиентскую линию socat , так как она выйдет немедленно (ну, через полсекунды :)):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... и возвращаясь к первому терминалу, мы видим, что сервер успешно показал все три hello :

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Обратите внимание, что даже при использовании сервера fork с socat линией строка echo "hello" | nc -u 127.0.0.1 5000 прежнему блокируется, как будто ожидает ввода пользователя; однако теперь после Ctrl-C и повторного запуска команды, т.е.

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... сервер fork с socat покажет три hello без необходимости перезапуска ..

 

Похоже, у этого netcat openBSD нет опции fork но я не уверен, что она соответствует ей ..

В любом случае, надеюсь, это кому-то поможет,
Ура!

4

Ваш netcat только читает вывод из stdout echo, когда вы используете pipe, он больше не "подключен" к клавиатуре. Чтобы получить ожидаемый ответ, вы можете добавить свои три "привет" в файл запустить

cat [myfile] | nc -u 127.0.0.1 5000
2

Если вы сделаете несколько прослушивающих nc, это покажет, что netcat ожидает соединения, и, как только оно получит его, подключится к этому хосту и порту, игнорируя все остальные. Вам нужно добавить '-k', чтобы продолжить работу, и '-w 0', чтобы отключить каждое соединение через 0 секунд. Думаю, Сокат - лучший выбор.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .