Способ передачи FTP-соединений от демона в приложение Rails? - PullRequest
1 голос
/ 08 марта 2011

Я собираюсь создать демон C или Ruby, который будет создавать FTP-соединения, поддерживать соединения (т. Е. Соединения пула) и действовать как прокси для FTP-сайтов для моего приложения Rails.Это позволит моему приложению Rails взаимодействовать с FTP-сайтами через вызовы AJAX и не будет нуждаться в повторном подключении к FTP-сайтам при каждом вызове AJAX.

Я бы хотел, чтобы демон объединял соединения, но я хотелне нужно использовать его в качестве прокси, потому что это дополнительная функциональность и, следовательно, дополнительное время.

Мой вопрос: Если я открываю FTP-соединение в своем процессе демона, есть ли способ просто передатьотключить соединения демона с моим приложением Rails?

Так что вместо того, чтобы делать это в моем приложении Rails

connection = Net::FTP.new('my.site.com')
connection.login
connection.get(remote_file_path, local_file_path)

Я бы хотел сделать что-то подобное

daemon_reference = ???
connection = daemon.getConnection(some_key)
connection.get(remote_file_path, local_file_path)

1 Ответ

2 голосов
/ 08 марта 2011

Как правило, вы не можете передавать соединения от одного процесса другому, за исключением одного: при разветвлении дочерний процесс наследует все соединения от родительского. Обычная операция fork оставляет дочерний файл с тем же набором файловых дескрипторов, что и родительский, и все открытые сокеты включаются в этот набор. Однако это однократная операция, поскольку новые файловые дескрипторы будут создаваться только в контексте одного процесса.

Вам, вероятно, придется прокси, чтобы это сработало, но это не будет сумасшествием. Вам просто понадобится способ для внешнего процесса запросить соединение, использовать соединение, а затем освободить соединение в пул. Это может быть выполнено в стиле FTP, когда вы общаетесь в одном сокете, а второй действует как канал данных.

Это не так сложно, как кажется. Вы можете создать сокет UNIX с именем «proxy.sock» и подключить к нему клиентов. Одна команда может запросить соединение с конкретным FTP-адресатом и получить путь назад, например «ftp.example.com.sock», который можно использовать для подключения к этому месту. Соединение одного потокового сокета с другим не очень сложно в этот момент, и определение, когда сокет закрыт на локальном конце, является обычной процедурой.

Сокеты UNIX могут быть более удобными, чем сокеты TCP, поскольку вам не придется беспокоиться о распределении или исчерпании номеров портов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...