Во-первых, вам необходимо понять обязательные поля в различных объектах, связанных с территорией
шаги
Абсолютно! ASIO повышения позволяет Вам получать доступ к собственным/базовым данным, которые в этом случае являются самим СОКЕТОМ. Так, скажем, Вы имеете:
boost::asio::ip::tcp::socket my_socket;
И скажем, Вы уже звонили open
или 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>);
}
Таким образом, там у Вас есть он! ASIO повышения позволяет Вам сделать много вещей более быстро, чем Вы иначе смогли, но существует много вещей, Вам все еще нужны нормальные призывы библиотеки сокета. Это, оказывается, один из них.
Это, кажется, не встроено в Повышение. Asio (с текущего Повышения 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_;
};