Назад | Перейти на главную страницу

Netcat: соединение потеряно до завершения передачи

Интересная вещь с 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 в свой сценарий оболочки, чтобы убедиться, что вы стреляете ему в голову, когда закончите (я оставлю эту часть в качестве упражнения для готовый).