Документация Boost.Asio не существует.Что означают эти ошибки?
-
19-09-2019 - |
Вопрос
Я борюсь с двумя ошибками в 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;
Я думаю, что это причина вашей ошибки, но, честно говоря, я не могу проследить ее дальше этого момента.