5

我正在为 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 将其设置为非阻塞,并对 SO_LINGER 和 SO_OOBINLINE 使用 setsockopt。

4

1 回答 1

1

无论如何,这都不是您第二个问题的完整解决方案。它生成的任何错误都应该映射到 aboost::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错误,因此错误必须来自第二段代码。reactor 类型来自 in 的一系列ifdef/elifboost/asio/stream_socket_service.hpp,其中只有register_descriptorin 的函数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;

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

于 2009-11-11T19:44:52.540 回答