Я знаю о недостатках дизайна "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)