6

ブーストasioでSO_RCVTIMEOおよびSO_SNDTIMEOソケットオプションを設定できますか?

もしそうなら、どのように?

代わりにタイマーを使用できることは知っていますが、特にこれらのソケットオプションについて知りたいです。

4

3 に答える 3

4

絶対!Boost ASIO を使用すると、ネイティブ/基礎となるデータ (この場合は SOCKET 自体) にアクセスできます。だから、あなたが持っているとしましょう:

boost::asio::ip::tcp::socket my_socket;

そして、実際に使用可能にするopenorまたは何らかのメンバー関数を既に呼び出しているとしましょう。次に、基になる SOCKET 値を取得するには、次のように呼び出します。bindmy_socket

SOCKET native_sock = my_socket.native();
int result = SOCKET_ERROR;

if (INVALID_SOCKET != native_sock)
{
    result = setsockopt(native_sock, SOL_SOCKET, <the pertinent params you want to use>);
}

それで、あなたはそれを持っています!Boost の ASIO を使用すると、他の方法よりも多くのことをより迅速に行うことができますが、通常のソケット ライブラリの呼び出しが必要なことがまだたくさんあります。これはたまたまそのうちの1つです。

于 2008-12-23T22:44:25.370 に答える
3

Boost.Asio には組み込まれていないようですが (現在の Boost SVN の時点では)、独自のクラスを作成してそれらをシミュレートするboost::asio::detail::socket_option場合は、いつでも の例に従って次のことを行うことができboost/asio/socket_base.hppます。

typedef boost::asio::detail::socket_option::timeval<SOL_SOCKET, SO_SNDTIMEO>
    send_timeout;
typedef boost::asio::detail::socket_option::timeval<SOL_SOCKET, SO_RCVTIMEO>
    receive_timeout;

(明らかに、timevalクラスをboost::asio::detail::socket_option名前空間に注入することをお勧めしているわけではありませんが、現時点では使用するのに適したものは思いつきません。:-P)

編集:socket_option::timevalに基づく、の私のサンプル実装socket_option::integer

// Helper template for implementing timeval options.
template <int Level, int Name>
class timeval
{
public:
  // Default constructor.
  timeval()
    : value_(zero_timeval())
  {
  }

  // Construct with a specific option value.
  explicit timeval(::timeval v)
    : value_(v)
  {
  }

  // Set the value of the timeval option.
  timeval& operator=(::timeval v)
  {
    value_ = v;
    return *this;
  }

  // Get the current value of the timeval option.
  ::timeval value() const
  {
    return value_;
  }

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

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

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

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

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

  // Set the size of the timeval data.
  template <typename Protocol>
  void resize(const Protocol&, std::size_t s)
  {
    if (s != sizeof(value_))
      throw std::length_error("timeval socket option resize");
  }

private:
  static ::timeval zero_timeval()
  {
    ::timeval result = {};
    return result;
  }

  ::timeval value_;
};
于 2008-11-15T20:25:24.843 に答える