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

basic_datagram_socket::native_non_blocking (1 of 3 overloads)

Boost , Boost.Asio , basic_datagram_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.

Получает неблокирующий режим реализации родного сокета.

bool native_non_blocking() const;

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

Return Value

<true>если базовое гнездо находится в неблокирующем режиме и прямые системные вызовы могут выйти из строя с<boost::asio::error::would_block>(или эквивалентной системной ошибкой).

Remarks

Текущий неблокирующий режим кэшируется объектом розетки. Следовательно, значение возврата может быть неправильным, если режим неблокировки был установлен непосредственно на родном гнезде.

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_datagram_socket::native_non_blocking (1 of 3 overloads) раздела Boost.Asio basic_datagram_socket::native_non_blocking может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:32:46/0.0036630630493164/0