Вопрос или проблема
Я хочу читать данные, поступающие на определенный 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
Когда вы вводите данные в одном окне терминала, они должны записываться в файл в пределах второго.
Важные замечания
-
Обратите внимание, что в случае работы с
nc
, если клиент разрывает соединение (например, при использовании Ctrl+C), сервер также остановится, если это не организовано в цикле. -
Убедитесь, что вы используете правильный синтаксис в зависимости от версии
nc
, так как GNU и BSD версии могут иметь различные опции.
Следуя этим указаниям, вы сможете успешно прослушивать TCP порт и сохранять все входящие данные в файл.