在boost套接字上设置选项SO_SETFIB

时间:2015-02-23 12:48:29

标签: sockets boost boost-asio

我没有看到在boost sockets上设置SO_SETFIB的任何选项。任何人都有任何想法或指出我正确的方向如何实现这一目标?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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);