Некоторое время я возился с тем, чтобы заставить это работать, поэтому я подозреваю, что какое-то фундаментальное недоразумение о том, как работают каналы, является основной причиной моих проблем.
Моя цель - инициировать TCP-соединение с некоторым удаленным хостом через netcat
и иметь два именованных канала в файловой системе: один, из которого процессы могут читать, чтобы получить входящие данные, и другой, который процессы могут записывать в этот файл, который служит в качестве исходящих данных. В настоящее время я использую следующую конструкцию:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
Отсюда я хотел бы разрешить другим процессам читать и записывать в / из этого открытого TCP-соединения. Должно ли это «просто работать», или есть причина, почему такая конструкция не может работать?
Что , кажется , произойдут в настоящее время является то , что я могу читать out
без проблем, но когда я пишу in
я получаю выход упоминая сломанную трубу и все последующие связи появляются мертвыми. Мысли?
(Связанный: я первоначально использовал:
netcat foo.bar.org 4000 < out > in &
но нашел его, чтобы заблокировать ожидание ввода. Мне тоже интересно об этом, но, вероятно, это лучше рассмотреть в отдельном вопросе.)
write(stdout): Broken pipe
после (или вскоре после) записи вout
трубу.Я тоже столкнулся с этой проблемой. Основная проблема есть
netcat
. Это отличный инструмент, но он закрывает соединение, когда один из его подключенных дескрипторов входных или выходных файлов закрыт. Он ничего не делает, когда сервер не слушает, и закрывается, когда другой узел закрыт. Пока вы правильно настроите сервер и сохраните дескрипторы файлов открытыми, он будет работать. Например, я протестировал следующий сценарий, и он работал очень хорошо: в настройках терминала эхо-сервер (я настроил его, как показано ниже):Теперь в другом терминале настройте ваше соединение fifo с вашим сервером:
распечатывать все, что сервер отправляет вам (и продолжать работать, если вы используете
in
fifo в приложении, которое закрывает один конец по завершению,netcat
закрывает соединение)и в том же терминале:
теперь все, что вы печатаете, будет напечатано снова (после нажатия Enter). Закрытие этой команды также закроет соединение.
источник
netcat -t -l -p 4000 < loopFF | tee loopFF
не вызвать бесконечный цикл обратной связи с самим собой?netcat
закрывается всякий раз, когда закрывается одно из его сетевых подключений. Если вы закроете клиент (который отправит строку и получит ту же строку),netcat
сервер также будет закрыт. В этом случае я написал для себя серверный код, который разветвляется для обработки нескольких клиентов и повторного подключения клиентов.Анализ Стивена Понедельника выглядит хорошо для меня:
cat
возвращается после вашей первой записи,out
потому что fifo естьempty
. Чтобы избежать этого, решение состоит в том, чтобы сохранить процесс с открытым fifo в режиме записи, 1-йcat
в приведенном ниже примере:(Файл out-pid - это способ остановить все это
kill -9 $(cat out-pid)
.)Еще один пример здесь .
источник