Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修改boost::asio::socket::set_选项_C++_Sockets_Tcp_Boost Asio - Fatal编程技术网

C++ 修改boost::asio::socket::set_选项

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的情况下进行操作?在更改选项之前是否需要关闭它?如果我不关上它,它会在我脸上爆炸吗?这方面的最佳实践是什么 我在文档中找不

我需要为连接到远程tcp服务器的
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));
  }
}