Netcat как многопоточный сервер


12

Я использую netcat для запуска простого сервера, подобного этому:

while true; do nc -l -p 2468 -e ./my_exe; done

Таким образом, любой может подключиться к моему хосту через порт 2468 и поговорить с «my_exe».
К сожалению, если кто-то еще захочет подключиться во время открытого сеанса, он получит ошибку «Отказано в соединении», потому что netcat больше не слушает до следующего цикла while.

Есть ли способ заставить netcat вести себя как многопоточный сервер, то есть всегда при прослушивании входящих соединений? Если нет, есть ли обходные пути для этого?


Вы можете использовать socat
sivann

Ответы:


18

вы используете не тот инструмент для этой задачи: используйте что-то вроде ucspi-tcp , особенно tcpserver :

tcpserver waits for incoming connections and, for each connection, 
runs a program of your choice.

2
Где это было всю мою жизнь ?!
Шридхар Сарнобат

Спасибо @akira, можешь привести пример?
Сабрина

3

Хотя вы не упомянули операционную систему, которую используете, я предполагаю, что это Linux или Unix, основываясь на синтаксисе вашего примера команды оболочки.

Если в вашей системе работает xinetd (или его предшественник inetd ), вы можете использовать это программное обеспечение для прослушивания соединения на выбранном вами порту и запустить исполняемый файл для ответа. С xinetd / inetd у вас есть возможность разрешить несколько одновременных подключений, каждое из которых обслуживается отдельным экземпляром вашего исполняемого файла.


-2

Скорее всего, вы могли бы просто фоновый процесс (тогда он не ждет возврата, прежде чем перейти к следующему циклу) с '&', такие как:

while true; do nc -l -p 2468 -e ./my_exe &; done

7
Это порождает множество подпроцессов и приводит к краху системы ....
jackweirdy

5
И только первый вызов будет работать; каждый последующий провалится, потому что на порту 2468 уже есть сокет сервера.
Даниэль Гриском,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.