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