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

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


person Community    schedule 11.11.2009    source источник
comment
Можете ли вы дать объявление/инициализацию для nativeSocket? Я думаю, что проблемы с проблемой 2 связаны с этим.   -  person rcollyer    schedule 11.11.2009
comment
Для вашего первого вопроса: Конец файла обычно указывает, что соединение было закрыто узлом.   -  person Éric Malenfant    schedule 11.11.2009
comment
Что касается вашего второго вопроса: не могли бы вы проверить, что возвращает boost::system::error_code() перед вызовом assign()?   -  person Éric Malenfant    schedule 11.11.2009


Ответы (1)


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

or

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;

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

person rcollyer    schedule 11.11.2009