Документация Boost.Asio отсутствует. Что означают эти ошибки? - PullRequest
5 голосов
/ 11 ноября 2009

Я борюсь с двумя ошибками в 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.

1 Ответ

1 голос
/ 11 ноября 2009

Это не полное решение вашей второй проблемы. Любые ошибки, которые он генерирует, должны быть отображены в 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;

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

...