Документация Boost.Asio не существует.Что означают эти ошибки?

StackOverflow https://stackoverflow.com/questions/1712641

Вопрос

Я борюсь с двумя ошибками в Boost.Asio.

Первое происходит, когда я пытаюсь получить данные через сокет:

char reply[1024];
boost::system::error_code error;
size_t reply_length = s.receive(boost::asio::buffer(reply, 1024), 0, error);
if (error) cout << error.message() << endl; //outputs "End of file"

Второе происходит, когда я пытаюсь создать ip::tcp::socket из (действительного!) собственного сокета:

boost::asio::io_service ioserv;
boost::asio::ip::tcp::socket s(ioserv);

boost::system::error_code error;
s.assign(boost::asio::ip::tcp::v4(), nativeSocket, error);
if (error) cout << error.message() << endl; //outputs "The parameter is incorrect"

Со всеми этими проблемами и отсутствием документации, к которой можно было бы обратиться, у меня возникает соблазн вернуться к сокетам BSD, но у меня там свои проблемы... так что, если кто-нибудь может помочь, я буду очень признателен.

РЕДАКТИРОВАТЬ:Что касается номера 2, NativeSocket объявляется следующим образом:

SOCKET nativeSocket = INVALID_SOCKET;
nativeSocket = accept(svr_sock, (struct sockaddr*)&sin, &size);

После этого с сокетом выполняются еще несколько действий, а именно: устанавливается неблокирующийся с помощью ioctlsocket и используется Setsockopt для SO_LINGER и SO_OOBINLINE.

Это было полезно?

Решение

Это ни в коем случае не является полным решением вашей второй проблемы.Любые ошибки, которые он генерирует, должны быть отображены в boost::system::error_code, но я не нахожу ничего подобного в boost/system/error_code.hpp, поэтому я не понимаю, что именно это должно означать.

Но, просмотрев код для boost 1.39, assign в конечном итоге передается либо detail::reactive_socket_service< Protocol, Reactor >.assign (или detail::win_iocp_socket_service<Protocol>, если вы используете Windows).Ошибка может быть только в двух местах. boost/asio/detail/reactive_socket_service.hpp:

if (is_open(impl))
{
  ec = boost::asio::error::already_open;
  return ec;
}

или

if (int err = reactor_.register_descriptor(
      native_socket, impl.reactor_data_))
{
  ec = boost::system::error_code(err,
      boost::asio::error::get_system_category());
  return ec;
}

Поскольку вы не получаете already_open ошибка, ошибка должна быть из второго бита кода.Тип реактора происходит из последовательности ifdef/elif пары в boost/asio/stream_socket_service.hpp, и из них доступны только register_descriptor функционировать в epoll_reactor может выдать любую ошибку (и конечно detail::win_iocp_socket_service<Protocol>.assign тоже можно).Ошибка в epoll_reactor происходит от sys/epoll.h, конкретно:

int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
if (result != 0)
  return errno;

В реализации Windows соответствующий код:

if (iocp_service_.register_handle(native_socket.as_handle(), ec))
  return ec;

Я думаю, что это причина вашей ошибки, но, честно говоря, я не могу проследить ее дальше этого момента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top