【发布时间】:2020-12-12 17:00:34
【问题描述】:
如果我有一个预先存在的打开文件描述符,引用一个已经绑定和监听的套接字,我如何使用它来初始化一个节俭服务器对象(最好是非阻塞服务器)并开始接受 RPC 请求?我见过的各种 ThriftSocket 对象只接受地址/端口(或只是端口)参数来自己创建套接字。
【问题讨论】:
如果我有一个预先存在的打开文件描述符,引用一个已经绑定和监听的套接字,我如何使用它来初始化一个节俭服务器对象(最好是非阻塞服务器)并开始接受 RPC 请求?我见过的各种 ThriftSocket 对象只接受地址/端口(或只是端口)参数来自己创建套接字。
【问题讨论】:
对于客户端,你有一个构造函数来从文件描述符构造一个套接字:
/**
* Constructor to create socket from file descriptor.
*/
TSocket(THRIFT_SOCKET socket, std::shared_ptr<TConfiguration> config = nullptr);
在 Unix 系统上,您可以发现 THRIFT_SOCKET 是 int,只需在此处输入您的描述符!
不幸的是,服务器端并非如此。继承 TServerSocket 不会解决您的问题,因为内部套接字成员是私有的。
但是,thrift 服务器都将TServerTransport 作为参数。因此,想法是继承TServerTransport 来创建自定义TServerSocket。原始的TServerSocket 可以在这里提供帮助。
但是,他们没有添加此功能的可能性这一事实可能意味着这样做并不安全。您别无选择,只能检查 TServerSocket.cpp 以检查内部实现。
【讨论】: