Интересная вещь с Netcat (nc) в CentOS 5 или 6 (nc-1.84-10.fc6 или nc-1.84-22.el6.x86_64). Как я могу это обойти? Я не могу найти ошибку по этому поводу, но
Он моделирует передачу файла на удаленный хост, где файл преобразуется, а затем результат отправляется обратно. В этом примере преобразование - «кошка».
Сервер (локальный):
$ mkfifo nctest.fifo
$ while :; do
nc -l 5000 <nctest.fifo | cat >nctest.fifo
echo -n .
sleep 1
done
Клиент (localhost):
$ cat testfile | nc 127.0.0.1 5000 > outfile
$ ls -l
total 9724
prw-r--r-- 1 root root 0 Nov 4 14:17 nctest.fifo
-rw-r--r-- 1 root root 4930560 Nov 4 14:17 outfile
-rw-r--r-- 1 root root 5000000 Nov 4 14:09 testfile
Размер Outfile варьируется от нуля до 5000000. Я могу добавить к клиенту «-w2», но это бесполезно.
Хммм .... ладно я считать Я знаю, что здесь происходит. Поскольку вы запускаете свой сервер с помощью команды конвейера (с использованием символа '|'), существует связь между nc
процесс и cat
обработать. Когда nc
обработка видит EOF в TCP-соединении, оно завершается ... что затем вызывает cat
процесс также для выхода (хотя он еще не прочитал все из канала).
Вы можете исправить это, изменив свой конвейер на что-то вроде этого:
nc -l 5000 <nctest.fifo | cat >nctest.fifo &
wait
echo -n .
... обратите внимание, '&' и wait
звонки. Конечно, это, вероятно, оставит фоновое задание запущенным, поэтому вы захотите добавить обработчик SIGCHLD в свой сценарий оболочки, чтобы убедиться, что вы стреляете ему в голову, когда закончите (я оставлю эту часть в качестве упражнения для готовый).