Netcat: соединение потеряно до завершения передачи
Интересная вещь с Netcat (nc) в CentOS 5 или 6 (nc-1.84-10.fc6 или nc-1.84-22.el6.x86_64). Как я могу обойти это? Я не могу найти ошибку по этому поводу, но
Он моделирует передачу файла на удаленный хост, где файл преобразуется, а затем результат отправляется обратно. В этом примере преобразование - "кошка".
Сервер (localhost):
$ 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
Размер выходного файла варьируется от нуля до 5000000. Я могу добавить "-w2" к клиенту, но это бесполезно.
1 ответ
Хммм... хорошо, я думаю, что знаю, что здесь происходит. Поскольку вы запускаете свой сервер с помощью команды конвейера (используя символ "|"), между nc
процесс и cat
процесс. Когда nc
обработка видит EOF на соединении TCP, она выходит... что затем вызывает cat
Процесс выхода также (хотя он еще не прочитал все из канала).
Вы можете исправить это, изменив ваш конвейер на что-то вроде этого:
nc -l 5000 <nctest.fifo | cat >nctest.fifo &
wait
echo -n .
... обратите внимание, '&' и wait
звонки. Конечно, это, вероятно, оставит фоновую работу запущенной, поэтому вы захотите добавить обработчик SIGCHLD в свой сценарий оболочки, чтобы убедиться, что вы выстрелите ему в голову, когда закончите (я оставлю эту часть в качестве упражнения для готов).