修改boost :: asio :: socket :: set_option

时间:2016-02-02 13:14:26

标签: c++ sockets tcp boost-asio

我需要为连接到远程TCP服务器的boost::asio::ip::tcp::no_delay设置选项boost::asio::socket_base::lingerboost::asio::ip::tcp::socket。我使用方法set_option来实现这一点而没有任何问题。

问题:一旦io_servicerun()socket打开,如果我被要求更改其选项(即:由于更改程序配置),我可以用套接字打开吗?在更改选项之前是否需要关闭它?如果我不关闭它,它会在我脸上爆炸吗?关于这个的最佳做法是什么?

我无法在文档中找到任何相关内容。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我做了一些测试。

set_optionget_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));
  }
}