Boost.Asio文档不存在.这些错误意味着什么?

5 c++ networking boost network-programming 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"
Run Code Online (Sandbox Code Playgroud)

第二种情况发生在我尝试从(有效!)本机套接字创建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"
Run Code Online (Sandbox Code Playgroud)

由于所有这些麻烦都没有文件可以转向,我很想回到BSD插座,但我在那里遇到了自己的问题......所以如果有人能提供帮助,我真的很感激.

编辑:关于数字2,因此声明nativeSocket:

SOCKET nativeSocket = INVALID_SOCKET;
nativeSocket = accept(svr_sock, (struct sockaddr*)&sin, &size);
Run Code Online (Sandbox Code Playgroud)

之后,对套接字进行了一些其他操作 - 即使用ioctlsocket将其设置为非阻塞,并使用setsockopt进行SO_LINGER和SO_OOBINLINE.

rco*_*yer 1

无论如何,这都不是解决您的第二个问题的完整解决方案。它生成的任何错误都应该映射到 a 中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;
}
Run Code Online (Sandbox Code Playgroud)

或者

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;
}
Run Code Online (Sandbox Code Playgroud)

由于您没有收到already_open错误,因此错误必定来自代码的第二位。反应器类型来自in 中的一系列ifdef/对,并且在这些可用的函数中,只有in 中的函数可以抛出任何错误(当然也可以)。中的错误来自,具体来说:elifboost/asio/stream_socket_service.hppregister_descriptorepoll_reactordetail::win_iocp_socket_service<Protocol>.assignepoll_reactorsys/epoll.h

int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);
if (result != 0)
  return errno;
Run Code Online (Sandbox Code Playgroud)

在windows实现中,相关代码为

if (iocp_service_.register_handle(native_socket.as_handle(), ec))
  return ec;
Run Code Online (Sandbox Code Playgroud)

我认为这是你错误的根源,但老实说,我无法追踪到这一点。