ブーストasioでSO_RCVTIMEOおよびSO_SNDTIMEOソケットオプションを設定できますか?
もしそうなら、どのように?
代わりにタイマーを使用できることは知っていますが、特にこれらのソケットオプションについて知りたいです。
ブーストasioでSO_RCVTIMEOおよびSO_SNDTIMEOソケットオプションを設定できますか?
もしそうなら、どのように?
代わりにタイマーを使用できることは知っていますが、特にこれらのソケットオプションについて知りたいです。
絶対!Boost ASIO を使用すると、ネイティブ/基礎となるデータ (この場合は SOCKET 自体) にアクセスできます。だから、あなたが持っているとしましょう:
boost::asio::ip::tcp::socket my_socket;
そして、実際に使用可能にするopen
orまたは何らかのメンバー関数を既に呼び出しているとしましょう。次に、基になる SOCKET 値を取得するには、次のように呼び出します。bind
my_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つです。
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_;
};