【问题标题】:How to get native socket file describer from boost::asio::ssl::stream<boost::asio::ip::tcp::socket>?如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
【发布时间】:2020-02-27 16:07:57
【问题描述】:

我正在使用boost::asio::ssl::stream&lt;boost::asio::ip::tcp::socket&gt;,但我需要运行

setsockopt(mSocket.native_handle(), SOL_TCP, TCP_USER_TIMEOUT, &tcpTimeout, sizeof(int));

我有一个编译错误:

error: invalid conversion from ‘boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >::native_handle_type {aka ssl_st*}’ to ‘int’ [-fpermissive]

如何获取boost::asio 套接字的本机套接字文件描述符?

谢谢。

亲切的问候。

【问题讨论】:

    标签: c++ linux boost boost-asio


    【解决方案1】:

    ssl::stream::native_handle() 返回 SSL 流句柄(对于 SSL* 类型的 OpenSSL)。

    要获取底层套接字的句柄,请使用ssl::stream::lowest_layer()

    setsockopt( sslStream.lowest_layer().native_handle(), ...
    

    【讨论】:

      【解决方案2】:

      根本不要这样做。它稍微麻烦一些,但您应该定义一个socket option,您所要做的就是定义一个可以接受协议并返回您在此处列出的选项的选项,这里是 SOL_TCP 的示例。

      class TCPUserTimeout{
      template<typename Protocol>
      int name(Protocol p){ return TCP_USER_TIMEOUT;}
      // And so on...
      };
      

      您甚至可以使用对所有选项都快速而肮脏的结构来构建通用的东西。如果这样做,我建议使用unique_ptr 来存储option_value

      【讨论】:

        猜你喜欢
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        相关资源
        最近更新 更多