C++ 修改boost::asio::socket::set_选项
我需要为连接到远程tcp服务器的C++ 修改boost::asio::socket::set_选项,c++,sockets,tcp,boost-asio,C++,Sockets,Tcp,Boost Asio,我需要为连接到远程tcp服务器的boost::asio::ip::tcp::no_delay和boost::asio::socket\u base::linger设置选项。我使用了方法set_option,以便在没有任何问题的情况下实现这一点 问题:一旦io\u服务run()ing且socket打开,如果要求我更改其选项(即:由于程序配置的更改),我是否可以在打开socket的情况下进行操作?在更改选项之前是否需要关闭它?如果我不关上它,它会在我脸上爆炸吗?这方面的最佳实践是什么 我在文档中找不
boost::asio::ip::tcp::no_delay
和boost::asio::socket\u base::linger
设置选项。我使用了方法set_option
,以便在没有任何问题的情况下实现这一点
问题:一旦io\u服务run()
ing且socket
打开,如果要求我更改其选项(即:由于程序配置的更改),我是否可以在打开socket的情况下进行操作?在更改选项之前是否需要关闭它?如果我不关上它,它会在我脸上爆炸吗?这方面的最佳实践是什么
我在文档中找不到任何与此相关的内容
提前谢谢。我已经做了一些测试
在从套接字设置\u选项或获取\u选项之前,必须打开它。否则会出现错误“提供的文件句柄无效”
关闭套接字
并再次打开后,所有选项“返回”为默认值。因此,您需要在每次打开后设置\u选项
s。我发现最好的地方是在传递给async\u connect
的回调中
调用异步连接的示例:
socketPtr->async_connect(endpoint_iter->endpoint(),
boost::bind(&ConnectCallback,
shared_from_this(),
boost::asio::placeholders::error));
回调定义:
void ConnectCallback(const boost::system::error_code& ec)
{
if (!ec)
{
// Set options here
boost::asio::socket_base::linger optionLinger(true, 0);
socketPtr->set_option(optionLinger);
boost::asio::ip::tcp::no_delay optionNoDelay(true);
socketPtr->set_option(optionNoDelay);
// Do what you must with the socket now, for instance async_read_some
socketPtr->async_read_some(boost::asio::buffer(buffer, BUFFER_LENGTH),
boost::bind(&ReadCallback,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}