Как прослушивать несколько 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