Я думаю, це близько до Linux - Netcat перестає слухати UDP-трафік - Супер Користувач , але я подумав, що краще все-таки запитати
Що стосується версій 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
три рази, натискаючи ENTER після кожного:
$ 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 - Обробка всіх видів Sockets , яка містить такі 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
було надіслане - однак, знову ж таки, послідовне виконання цієї команди не спричинить жодного прийому на сервері, доки сервер не буде перезапущений.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), однак, хоча я бачу триhello
секунди, які головоломки у мене все ще присутні: ця команда теж наче "заблокує", наче очікуючи на введене введення з користувач, а після Ctrl-C та його повторного оновлення сервер не побачить жодних даних до його перезавантаження !? Це те, що я хотів би знати краще - ура!