2016-02-02 96 views
1

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

的问题(S):一旦io_servicerun() ING和socket开了,如果有人问我改变它的选项(即:由于在程序配置的变化),我可以与插座做打开?在更改选项之前是否需要关闭它?如果我不关闭它,它会在我的脸上爆炸吗?有关这方面的最佳做法是什么?

我在文档中找不到关于此的任何内容。

预先感谢您。

回答

1

我已经做了一些测试。

您从socket必须openset_optionget_option之前。否则,您将收到错误“提供的文件句柄无效”。

关闭socket并再次打开后,所有选项都会回到默认值。所以你需要在open之后每次登录set_option。我发现我做这件事的最好的地方在于传递给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)); 
    } 
}