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

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

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

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

Ценю вашу помощь..

решение1

Я хочу читать данные, поступающие на определенный порт 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

решение2

экран слева

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

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

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

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

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

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

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

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

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

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

Связанный контент