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

basic_stream_socket::native_non_blocking (2 of 3 overloads)

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

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

void native_non_blocking(
    bool mode);

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

Parameters

mode

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

Exceptions

boost::system::system_error

Выброшен на провал. Если<mode>—<false>, а текущее значение<non_blocking()>—<true>, то эта функция не справляется с<boost::asio::error::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_stream_socket::native_non_blocking (2 of 3 overloads) раздела Boost.Asio basic_stream_socket::native_non_blocking может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:07:20/0.022941112518311/1