如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?



我正在使用boost::asio::ssl::stream<boost::asio::ip::tcp::socket>,但我需要运行

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套接字的本机套接字文件描述符?

谢谢。

致以亲切的问候。

ssl::stream::native_handle()返回SSL流句柄(如果是SSL*类型的OpenSSL(。

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

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

根本不要这样做。它稍微麻烦一些,但你应该定义一个套接字选项,你所要做的就是定义一个可以接受协议并返回你列出的选项。这里有一个SOL_TCP的例子。

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

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

最新更新