2015-02-23 56 views

回答

1

你會使用boost::asio::detail::socket_option::integer套接字選項幫手模板:

typedef boost::asio::detail::socket_option::integer<SOL_SOCKET, SO_SETFIB> set_fib; 

// ... 
sock.set_option(set_fib(42)); 
+0

謝謝。我會嘗試。你能指點我的任何文件嗎?我不想設置套接字選項,我需要幫助在tcp :: resolver – 2015-02-23 15:35:11

+0

方向@BTRNaidu不幸的是'set_option'接口('SettableSocketOption'概念)沒有記錄;您必須查看頭文件以瞭解如何使用它。 – ecatmur 2015-02-23 15:42:00

+0

它確實有幫助。謝謝。但是現在我必須在解析器上設置套接字選項。你有一些代碼嗎? – 2015-02-23 17:32:35

1

如果Boost.Asio的不支持套接字選項,則可以創建或者GettableSocketOption和/或SettableSocketOption型需求的車型,以滿足那些需求。

socket::set_option()接受模擬SettableSocketOption類型需求的對象。該模型必須提供返回合​​適的值的一些功能的SettableSocketOption型需求文檔被傳遞到POSIX setsockopt()

class option 
{ 
    int level(Protocol) const;  // The 'level' argument. 
    int name(Protocol) const;  // The 'name' argument. 
    const int* data(Protocol) const // The 'option_value' argument. 
    std::size_t size(Protocol) const // The 'option_len' argument. 
}; 

人能想到socket.set_option(option),彷彿它是:

setsocketopt(socket.native_handle(), option.level(protocol), 
      option.name(protocol), option.data(protocol), 
      option.size(protocol)); 

議定書通過功能是Protocol類型要求的一個模型。


這裏是一個set_fib類,它是SettableSocketOption的典範:

class set_fib 
{ 
public:  
    // Construct option with specific value. 
    explicit set_fib(int value) 
    : value_(value) 
    {} 

    // Get the level of the socket option. 
    template <typename Protocol> 
    int level(const Protocol&) const { return SOL_SOCKET; } 

    // Get the name of the socket option. 
    template <typename Protocol> 
    int name(const Protocol&) const { return SO_SETFIB; } 

    // Get the address of the option value. 
    template <typename Protocol> 
    const int* data(const Protocol&) const { return &value_; } 

    // Get the size of the option. 
    template <typename Protocol> 
    std::size_t size(const Protocol&) const { return sizeof(value_); } 

private: 
    int value_; 
}; 

用法:

boost::asio::ip::tcp::socket socket(io_service); 
// ... 
set_fib option(42); 
socket.set_option(option);