Как использовать nc для бесконечного прослушивания TCP порта?

Вопрос или проблема

Я хочу читать данные, поступающие на определенный TCP-порт, бесконечно и записывать их в файл. Я пробовал разные варианты nc, но у меня ничего не получилось. В основном я не получаю никаких ошибок в консоли. Вот что я пробовал:

nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile

Буду благодарен за вашу помощь..

Я хочу читать данные, поступающие на определенный TCP-порт, бесконечно

Это не совсем имеет смысл… если бы вам были интересны все данные, поступающие на UDP-порт, тогда да – TCP, однако, является протоколом, основанным на соединении. Как только клиент подключается, и вы вызываете accept(), у вас остается два сокета – один прослушивающий и один, подключенный к клиенту… nc закроет оригинальный прослушивающий сокет и будет работать один на один с клиентом.


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

socat TCP-LISTEN:12345,fork FD:1 >> ../myfile

Это создаст прослушивающий сокет и создаст новый процесс при подключении – сохраняя прослушивающий сокет активным. Все полученные данные будут записываться в stdout (номер дескриптора файла 1), который перенаправлен в ../myfile для добавления.

ПРИМЕЧАНИЕ: данные будут получены от любого количества клиентов, в порядке, который не гарантирован, без оформления… т.е. это будет смесь перемешанных данных, если у вас более одного клиента одновременно.


Если вы хотите, чтобы socat сам обрабатывал файл, вы можете использовать один из параметров CREATE или OPEN (см. страницу документации):

socat TCP-LISTEN:12345,fork OPEN:../myfile,append

Если вас устраивает подход “один клиент за раз”, то поместите nc в цикл:

while :; do nc -l 12345; done >> ../myfile

Проверьте это с помощью nc:

nc localhost 12345

экран слева

nc -l 1234 запускает сервер.

экран справа nc 127.0.0.1 1234 подключается.

похоже, у вас неправильные команды.

Также стоит узнать, используете ли вы версию gnu или bsd, у меня bsd. команда man nc показывает “NC(1) BSD Общее руководство по командам”. Чтобы запустить сервер в gnu-версии, может потребоваться -l с -p. Для подключения клиента к серверу на любом порту никогда не следует использовать -p.

введите описание изображения здесь

Вы также можете использовать -v

введите описание изображения здесь

Ваша основная проблема заключалась в том, что вы не могли запустить это вообще.

Ваш вопрос касается постоянной работы, и я бы заметил, что если вы нажмете ctrl-c со стороны клиента, то, кроме разрыва соединения, это остановит сервер. Вы можете поместить этот сервер в режим ожидания в цикле. Это сработает. Тогда сервер продолжает слушать и остается доступным, если вы попытаетесь подключиться снова после нажатия ctrl-c со стороны клиента.

введите описание изображения здесь

Ответ или решение

Конечно! Для того чтобы использовать nc (netcat) для прослушивания определенного TCP порта на неограниченное время и записи получаемых данных в файл, вы можете воспользоваться несколькими подходами.

Подход 1: Использование netcat в цикле

Если вы хотите использовать nc, который будет обрабатывать только одного клиента за раз, вы можете запустить его в бесконечном цикле:

while :; do nc -l 12345; done >> ../myfile

Подход 2: Использование socat

Если вам нужно обрабатывать подключения от нескольких клиентов одновременно, я рекомендую использовать socat, так как он поддерживает многопоточную работу:

socat TCP-LISTEN:12345,fork FD:1 >> ../myfile

Эта команда открывает TCP порт 12345 для прослушивания. Каждый раз, когда клиент подключается, socat создаст новый процесс для обработки подключения, оставляя основной сокет открытым. Все данные, полученные от клиентов, будут записаны в ../myfile.

Дополнительные возможности socat

Если вы хотите, чтобы socat сам обрабатывал запись в файл, вы можете использовать следующие варианты:

socat TCP-LISTEN:12345,fork OPEN:../myfile,append

Это обеспечит добавление полученных данных в файл ../myfile напрямую.

Тестирование

Чтобы протестировать ваше серверное приложение, вы можете открыть другой терминал и использовать nc для подключения к серверу:

nc localhost 12345

Когда вы вводите данные в одном окне терминала, они должны записываться в файл в пределах второго.

Важные замечания

  1. Обратите внимание, что в случае работы с nc, если клиент разрывает соединение (например, при использовании Ctrl+C), сервер также остановится, если это не организовано в цикле.

  2. Убедитесь, что вы используете правильный синтаксис в зависимости от версии nc, так как GNU и BSD версии могут иметь различные опции.

Следуя этим указаниям, вы сможете успешно прослушивать TCP порт и сохранять все входящие данные в файл.

Оцените материал
Добавить комментарий

Капча загружается...