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