【问题标题】:Use pre-existing socket with thrift server?将预先存在的套接字与节俭服务器一起使用?
【发布时间】:2020-12-12 17:00:34
【问题描述】:

如果我有一个预先存在的打开文件描述符,引用一个已经绑定和监听的套接字,我如何使用它来初始化一个节俭服务器对象(最好是非阻塞服务器)并开始接受 RPC 请求?我见过的各种 ThriftSocket 对象只接受地址/端口(或只是端口)参数来自己创建套接字。

【问题讨论】:

    标签: c++ thrift


    【解决方案1】:

    对于客户端,你有一个构造函数来从文件描述符构造一个套接字:

    /**
       * Constructor to create socket from file descriptor.
       */
      TSocket(THRIFT_SOCKET socket, std::shared_ptr<TConfiguration> config = nullptr);
    

    在 Unix 系统上,您可以发现 THRIFT_SOCKETint,只需在此处输入您的描述符!

    不幸的是,服务器端并非如此。继承 TServerSocket 不会解决您的问题,因为内部套接字成员是私有的。

    但是,thrift 服务器都将TServerTransport 作为参数。因此,想法是继承TServerTransport 来创建自定义TServerSocket。原始的TServerSocket 可以在这里提供帮助。

    但是,他们没有添加此功能的可能性这一事实可能意味着这样做并不安全。您别无选择,只能检查 TServerSocket.cpp 以检查内部实现。

    【讨论】:

    • 很有趣,谢谢。我见过的服务器示例使用的 TServerSocket 和 TNonblockingServerSocket 没有这样的构造函数。 TSocket 可以安全地替代 TServerSocket 吗?他们似乎不共享父类。
    • @randian 你说得对,这仅适用于客户端 API,我的错误。我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2023-03-27
    • 2014-01-11
    相关资源
    最近更新 更多