Я думаю, это близко к 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
и вводю еще два раза; но сервер зарегистрировал только первый hello
(который был передан по каналу echo
). Кроме того, даже если вы нажмете Ctrl-C и попытаетесь повторить команду клиента 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
будут зарегистрированы - без перезагрузки сервера? Или, может быть, есть специальный переключатель командной строки для такого поведения?
EDIT: Я нашел хороший PDF презентацию: SOCAT - Обработка всех видов сокетов, который содержит следующие netcat
против socat
примечания:
netcat - ограничения
● только один выстрел (завершается после закрытия сокета)
...
Примеры 1: замена netcat
...
● UDP-клиент с портом источника:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● TCP-сервер:
nc -l -p 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
было отправлено - однако, опять же, последовательные запуски этой команды не вызовут какого-либо приема на сервере, пока сервер не будет перезапущен.