我需要为连接到远程TCP服务器的boost::asio::ip::tcp::no_delay
设置选项boost::asio::socket_base::linger
和boost::asio::ip::tcp::socket
。我使用方法set_option
来实现这一点而没有任何问题。
问题:一旦io_service
为run()
而socket
打开,如果我被要求更改其选项(即:由于更改程序配置),我可以用套接字打开吗?在更改选项之前是否需要关闭它?如果我不关闭它,它会在我脸上爆炸吗?关于这个的最佳做法是什么?
我无法在文档中找到任何相关内容。
提前谢谢。
答案 0 :(得分:1)
我做了一些测试。
set_option
或get_option
来自socket
之前必须 open
它。否则你会收到错误" 提供的文件句柄无效"。
关闭socket
并再次打开后,所有选项"返回"默认。因此,您需要set_option
之后每次open
。我发现最好的地方让我这样做是在传递给async_connect
的回调中。
对async_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));
}
}