Наследовано от basic_socket.
Устанавливает режим неблокирования реализации родного гнезда.
boost::system::error_code native_non_blocking(
bool mode,
boost::system::error_code & ec);
Эта функция используется для изменения режима неблокирования основного туземного сокета. Это не влияет на поведение синхронных операций объекта сокета.
- mode
Если Правда
, то основной розеток помещается в режим неблокирования, а прямые системные звонки могут потерпеть неудачу с boost::asio::ror::would_block
(или эквивалентная системная ошибка).
- ec
Установить, чтобы указать, какие ошибки произошли, если таковые имеются. Если mode
является false
, но текущее значение non_blocking()
является Правда
, эта функция не работает с boost::asio::ror::invalid_argument
, как комбинация не имеет смысла.
Эта функция предназначена для того, чтобы позволить инкапсуляцию произвольных неблокирующих систем вызовов как асинхронных операций, таким образом, что является прозрачным для пользователя объекта сокета. Следующий пример иллюстрирует, как системный вызов Linux sendfile
может быть инкапсулирован:
template <typename Handler>
struct sendfile_op
{
tcp::socket& sock_;
int fd_;
Handler handler_;
off_t offset_;
std::size_t total_bytes_transferred_;
void operator()(boost::system::error_code ec, std::size_t)
{
if (!ec)
if (!sock_.native_non_blocking())
sock_.native_non_blocking(true, ec);
if (!ec)
{
for (;;)
{
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;
if (ec == boost::asio::error::interrupted)
continue;
if (ec == boost::asio::error::would_block
|| ec == boost::asio::error::try_again)
{
sock_.async_write_some(boost::asio::null_buffers(), *this);
return;
}
if (ec || n == 0)
{
break;
}
}
}
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);
}