Socat надежная передача файлов по TCP

8

Я знаю о недостатках дизайна "wait-> stop", который обычно предлагается с netcat:

server$ cat test.dat | nc -q 10 -l -p 7878
client$ nc -w 10 remotehost 7878 > out.dat

(Это ненадежно: не зная, сколько времени вы ждете, всегда возможно, что в течение одной секунды было узкое место в сети. - Другое дело -> зачем ждать 10 секунд, если вы можете сразу узнать, что данные передаются, и начать их обработку!)

Я хотел бы решения, с надежным и хорошим закрытием потока TCP .

Я нашел сокат с закрытием, как описано в man socat:

Когда один из потоков эффективно достигает EOF, начинается фаза закрытия. Socat передает условие EOF в другой поток, то есть пытается отключить только свой поток записи, что дает ему возможность корректно завершиться.

Я нашел следующие команды, работающие:

Сервер, отправляющий файл:

server$ socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
client$ socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat

Сервер, получающий файл:

server$ socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat && cat out.txt
client$ socat -u FILE:test.txt TCP:127.0.0.1:9876

Это надежно? Можно ли это улучшить? (Я использовал правильные опции? Есть ли лучшие варианты для настройки? - Их так много с socat)

Гжегож Вежовецкий
источник
Для последователей во втором примере («файл, принимающий сервер») есть «типичный» клиент, отправляющий файл на сервер ... также в более новых версиях netcat есть опция «-N -q 0», которая должна обеспечить более надежную работу. переводы, чем старый механизм «жди и надейся» :)
rogerdpack

Ответы:

6

Похоже, ваше ядро ​​твердое - оно должно быть надежным и должно завершиться после полной отправки файла.

Однако, если он out.txtуже существует, то эта настройка может работать некорректно. Если out.txtон длиннее test.txt, последняя часть out.txtостанется, так как socat перезаписывает файл побайтно, вместо того, чтобы убедиться, что файл пуст. Есть несколько способов исправить это, в зависимости от того, что вы хотите сделать:

  • OPEN:out.txt,creat,truncудалит все байты out.txtперед записью в него. Эта опция имитирует то, что вы ожидаете cp, и, вероятно, то, что вы хотите.
  • OPEN:out.txt,creat,exclоткажется писать, out.txtесли он уже существует. Используйте эту опцию для дополнительной безопасности.
  • OPEN:out.txt,creat,appendдобавит данные в out.txt.

Мне также нравится запускать md5sumисходные и конечные файлы всякий раз, когда я делаю что-то подобное, из-за такого рода угловых случаев.

Jander
источник
замечательно, что вы упомянули про "trunc" и эти крайние случаи. Что касается md5sum, в моем случае это проблема, потому что мне нужно перенести все вещи без закрытия соединения ("one-shot";)). Даже ты, это хорошо упомянуть для других читателей :).
Гжегож Вежовецкий