можно ли установить SO_RCVTIMEO и опции сокета SO_SNDTIMEO в повышении asio?

Во-первых, вам необходимо понять обязательные поля в различных объектах, связанных с территорией

  1. Обязательными полями UserTerritory2Association являются Territory2Id и UserId
  2. Обязательные поля объекта Territory2: - AccountAccessLevel, CaseAccessLevel, DeveloperName , Name, OpportunityAccessLevel, Territory2ModelId, Territory2TypeId
  3. Territory2Model обязательные поля: - DeveloperName, Name
  4. Territory2Type обязательные поля: - DeveloperName, MasterLabel, Priority

шаги

  1. Создать запись Territory2Type со всеми обязательными полями
  2. Создать запись Territory2Model со всеми обязательными полями
  3. Создать запись Territory2 со всеми обязательными полями и иметь ссылку для Territory2Type и Territory2Model из шага 1 и 2
  4. Создать запись пользователя
  5. Создать запись UserTerritory2Association с userId из шага 4 и Territory2Id из шага 3, запомните комбинацию userId и Territory2Id должен быть уникальным для каждой записи, в противном случае вы получите исключение Duplicate record
5
задан Brian R. Bondy 15 November 2008 в 20:13
поделиться

2 ответа

Абсолютно! 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 повышения позволяет Вам сделать много вещей более быстро, чем Вы иначе смогли, но существует много вещей, Вам все еще нужны нормальные призывы библиотеки сокета. Это, оказывается, один из них.

3
ответ дан 14 December 2019 в 13:50
поделиться

Это, кажется, не встроено в Повышение. 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_;
};
3
ответ дан 14 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: