一种将 FTP 连接从守护程序传递到 Rails 应用程序的方法?

A way to hand off FTP connections from a daemon to a Rails app?

我将创建一个 C 或 Ruby 守护程序,它们将创建 FTP 连接、保持连接活动(即池连接)并充当我的 Rails 应用程序的 FTP 站点的代理。这将允许我的 Rails 应用通过 AJAX 调用与 FTP 站点进行通信,而不必在每次 AJAX 调用时重新连接到 FTP 站点。

我希望该守护进程将连接池化,但是,我希望不必将其用作代理,因为那是额外的功能和额外的时间。

我的问题:如果我在我的守护进程中打开一个 FTP 连接,有没有办法简单地将连接从守护进程切换到我的 Rails 应用程序?

所以不要在我的 Rails 应用程序中这样做

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

我想做这样的事情

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


通常您不能将连接从一个进程切换到另一个进程,但有一个例外:当分叉时,子进程将继承父进程的所有连接。一个正常的 fork 操作让子进程拥有与父进程相同的文件描述符集,并且任何打开的套接字都包含在该集中。不过,这是一次性操作,因为新文件描述符将仅在一个进程的上下文中创建。

您可能需要代理才能使其正常工作,但这并不难。您只需要一种方法让您的外部进程请求连接、使用连接,然后将连接释放到池中。这可以通过 FTP 样式完成,您在一个套接字上进行通信,第二个充当数据通道。

这并不像听起来那么棘手。您可以创建一个名为 "proxy.sock" 的 UNIX 套接字并让客户端连接到该套接字。一个命令可以请求连接到特定的 FTP 目的地,它会得到一条返回路径,如 "ftp.example.com.sock",它可以用来连接到该位置。在这一点上,将一个流套接字桥接到另一个并不是很棘手,并且检测本地端的套接字何时关闭是例行公事。

UNIX 套接字比 TCP 套接字更方便,因为您不必担心分配或用完端口号。