Как прослушивать несколько tcp-соединений с помощью nc
Как создать TCP-соединение с помощью nc
, которое прослушивает несколько хостов?
nc -l -p 12345
Ответы
Ответ 1
Одновременные соединения невозможны при netcat
. Вы должны использовать что-то вроде ucspi-tcp
tcpserver
инструмент или рычаг xinetd
, поскольку вы находитесь в Linux.
Смотрите: https://superuser.com/questions/232747/netcat-as-a-multithread-server
Последовательные соединения могут обрабатываться через оболочку script, которая перезапускает netcat
после завершения.
Ответ 2
ncat
может это сделать.
например. ncat --broker --listen -p 12345
будет распространять все входящие сообщения всем другим клиентам (подумайте об этом как о хабе).
Ответ 3
Я рекомендую socat
в качестве альтернативы nc
.
Для проблем с OP, socat - TCP-LISTEN:12345,fork,reuseaddr
может сделать эту работу.
Ответ 4
-к
Силы nc продолжают прослушивать другое соединение после завершения его текущего соединения. Ошибка использования этой опции без опции -l.
Ответ 5
Это неполный ответ, потому что у меня это не работает. Возможно, это скорее вопрос, на самом деле. Может быть, кто-то еще может закончить это.
Прежде всего, похоже, существуют разные версии netcat. Я нахожусь на Ubuntu, поэтому я, вероятно, получил версию, которая шла с Ubuntu. Когда я nc -h
говорит следующее:
OpenBSD netcat (Debian patchlevel 1.187-1ubuntu0.1)
Когда я запускаю man nc
, он говорит следующее:
-F Pass the first connected socket using sendmsg(2) to stdout and exit. This
is useful in conjunction with -X to have nc perform connection setup with
a proxy but then leave the rest of the connection to another program (e.g.
ssh(1) using the ssh_config(5) ProxyUseFdpass option).
Мне кажется, что это означает, что вместо обычной операции с stdin и stdout он просто печатает что-то на stdout. Это что-то может затем использоваться другим процессом для установления фактического соединения с клиентом.
К сожалению, -F
не имеет эффекта, который я вижу. Так что, возможно, я делаю это неправильно. Или, может быть, где-то есть секретная pipeка, которую я должен выслушать, или дополнительный аргумент, который они забыли задокументировать. Или, может быть, у меня сломанная сборка netcat, и она работает для всех, кто работает в Ubuntu.
В сочетании с опцией -k
(или, если это невозможно, цикл while-true), это позволит многим различным клиентам иметь отдельные соединения. Предположим, у вас есть исполняемый файл с именем handle_connection
, который принимает в качестве аргументов дескриптор входного файла от клиента и дескриптор выходного файла для клиента и порождает подпроцесс, который связывается с клиентом. Тогда скрипт сервера может выглядеть так:
nc -lkF $host $port | while read in out ; do
handle_connection $in $out ;
done