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