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

453
user422171

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

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

Ценю твою помощь..

0
Каково было ваше намерение использовать `-v` и` -p`? Attie 5 лет назад 0
@ Att -v, чтобы увидеть, что он получает, и -p для номера порта. user422171 5 лет назад 0
Да, но почему это было бы полезно, чтобы попытаться заставить его продолжать слушать? Attie 5 лет назад 0
@ Attie Это было просто для проверки команды, если она работает, и чтобы узнать, как она работает. Собирался удалить это в конце концов .. user422171 5 лет назад 0

2 ответа на вопрос

0
Attie

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

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


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

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

Это настроит прослушивающий сокет и подключит новый процесс к соединению - сохраняя прослушивающий сокет. Все полученные данные будут записаны в стандартный вывод (дескриптор файла 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 
Я должен был дать понять в вопросе. У меня есть только один клиент, отправляющий на этот порт. Мне просто нужно захватить все, что приходит на этот порт и положить его в файл user422171 5 лет назад 0
... тогда что не так с `nc -l 12345 >> ../ myfile`? Attie 5 лет назад 0
Он создает файл, но никогда не записывается. Я проверил клиента, отправляющего строку каждые 2 секунды. user422171 5 лет назад 0
Я думаю, что вы упомянули в ответе, является причиной. Я не создаю сокет. Я пытаюсь подписаться на порт и начать слушать без подключения к сокету user422171 5 лет назад 0
0
barlop

экран слева

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

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

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

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

enter image description here

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

enter image description here

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

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

enter image description here

Когда я запускаю сервер, я получаю следующее: «Предупреждение: не удалось выполнить обратный поиск имени для 0.0.48.56» user422171 5 лет назад 0
Также команда клиента ничего не делает user422171 5 лет назад 0
@ user422171 Вы пытались добавить -n, например, `nc -lvn 12345` и` $ nc -vn 127.0.0.1 12345` https://stackoverflow.com/questions/48779583/nc-command-inverse-host-lookup-failed- unknown-host А на стороне клиента после соединения попробуйте набрать что-нибудь и нажать ENTER. Это должно быть то, что, я думаю, может быть названо эхо-сервером, то есть то, что вы наберете (и нажмете ввод после) на клиенте, будет отражено на сервере. barlop 5 лет назад 0
Попробовал `nc -lvn 12345` и получил` Ошибка: не удалось разрешить хост "12345" ` user422171 5 лет назад 0
@ user422171 Есть идеи, какую версию nc debian использует по умолчанию или какая у вас версия? что если вы попробуете `nc -n -l -p 12345`? или `nc -n -p 12345`? barlop 5 лет назад 0
Версия `netcat (GNU Netcat) 0.7.1` user422171 5 лет назад 0
@ user422171 ладно .. у меня BSD .. так что я не могу особо комментировать .. Я уже использовал GNU один раньше и думаю, что это `nc -l -p 12345` или` nc -lp 12345` или если вы попробуйте добавить -n, чтобы избавиться от этого предупреждения о проблеме с поиском имени, а затем `nc -n -l -p 12345` или -nlp 12345. Если это работает, вам нужно только выяснить, как подключить клиент , например, посмотрите здесь это выглядит как GNU nc, и они делают и сервер и клиент https://i.imgur.com/uVow4SB.png barlop 5 лет назад 0
Спасибо! пробовал `nc -nlp 12344` Ошибка получена` Ошибка: не удалось настроить сокет прослушивания (err = -3) `Я думаю, что это некоторый прогресс, потому что впервые за последние несколько дней он говорит, что пытался создать сокет прослушивания .. user422171 5 лет назад 0

Похожие вопросы