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