修改提升::asio::socket::set_option

Modifying boost::asio::socket::set_option

本文关键字:set option socket asio 修改      更新时间:2023-10-16

我需要为连接到远程 TCP 服务器的boost::asio::ip::tcp::socket设置选项boost::asio::ip::tcp::no_delayboost::asio::socket_base::linger。我使用了set_option的方法,以便毫无问题地实现这一目标。

问题:一旦io_service run()并打开socket,如果要求我更改其选项(即:由于程序配置的更改),我可以在打开套接字的情况下进行操作吗?在更改选项之前是否需要关闭它?如果我不关闭它,它会在我脸上爆炸吗?这方面的最佳实践是什么?

我无法在文档中找到有关此的任何内容。

提前谢谢你。

我做了一些测试。

set_optionget_option socket之前,您必须open它。否则,您会收到错误"提供的文件句柄无效"。

关闭socket并再次打开后,所有选项"返回"为默认值。所以你需要每次set_optionopen.我发现这样做的最佳位置是在传递给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));
  }
}