2016-02-02 101 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)); 
    } 
}