Я знаю о недостатках дизайна "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)
источник
Ответы:
Похоже, ваше ядро твердое - оно должно быть надежным и должно завершиться после полной отправки файла.
Однако, если он
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
исходные и конечные файлы всякий раз, когда я делаю что-то подобное, из-за такого рода угловых случаев.источник