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