Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

basic_seq_packet_socket::native_non_blocking (3 of 3 overloads)

Boost , Boost.Asio , basic_seq_packet_socket::native_non_blocking

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Наследовано от basic_socket.

Устанавливает режим неблокирования реализации родного гнезда.

boost::system::error_code native_non_blocking(
    bool mode,
    boost::system::error_code & ec);

Эта функция используется для изменения режима неблокирования основного туземного сокета. Это не влияет на поведение синхронных операций объекта сокета.

Parameters

mode

Если Правда, то основной розеток помещается в режим неблокирования, а прямые системные звонки могут потерпеть неудачу с boost::asio::ror::would_block (или эквивалентная системная ошибка).

ec

Установить, чтобы указать, какие ошибки произошли, если таковые имеются. Если mode является false, но текущее значение non_blocking() является Правда, эта функция не работает с boost::asio::ror::invalid_argument, как комбинация не имеет смысла.

Example

Эта функция предназначена для того, чтобы позволить инкапсуляцию произвольных неблокирующих систем вызовов как асинхронных операций, таким образом, что является прозрачным для пользователя объекта сокета. Следующий пример иллюстрирует, как системный вызов Linux sendfile может быть инкапсулирован:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;
  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(boost::system::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);
    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = boost::system::error_code(n < 0 ? errno : 0,
            boost::asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;
        // Retry operation immediately if interrupted by signal.
        if (ec == boost::asio::error::interrupted)
          continue;
        // Check if we need to run the operation again.
        if (ec == boost::asio::error::would_block
            || ec == boost::asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_write_some(boost::asio::null_buffers(), *this);
          return;
        }
        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }
        // Loop around to try calling sendfile again.
      }
    }
    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};
template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_write_some(boost::asio::null_buffers(), op);
}

PrevUpHomeNext

Статья basic_seq_packet_socket::native_non_blocking (3 of 3 overloads) раздела Boost.Asio basic_seq_packet_socket::native_non_blocking может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: basic_seq_packet_socket::native_non_blocking ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:11:29/0.0088720321655273/1