2

有没有办法允许在 ASIO 中使用已经连接的套接字?

尝试发送一个请求;ip::tcp::socket::assign在 2 个不同的地方随机给出 2 个不同的段错误。一种是在调用回调之前(on op_queue_acess::next),另一种是在回调之后(on boost::asio::detail::task_io_service_operation::complete(func_等于0并尝试执行))。所以我猜它不适用于连接的套接字。

编辑:

情况是,我有一个连接的本机描述符(实际上是另一个库下的套接字),我想将它分配给一个新的空 ip::tcp::socket 以便在套接字准备好时通知我read(使用带socket::async_read_some空缓冲区)并以非阻塞方式使用库。

示例代码如下:

class C
{
 ip::tcp::socket socket_;
 const char connection_info_[] = "...";
 TPLibrary tp_;

 void start()
 {
  .
  .
  tp_.connect(connection_info);
  socket_.assign(ip::tcp::v4(), tp_.nativeSocket());
 }
}

然后在此套接字上使用 async_read 会给出所述段错误,有时是在调用回调之后,有时是在之前。

编辑:现在我已经删除了所有内容,只有 tcp::socket 并分配给左边的套接字,但仍然 boost 给出了段错误。是因为 io_service 位于动态加载的库中,而套接字位于另一个动态加载的库中,并且引用了主库上的 io_service 吗?

4

2 回答 2

1

您可以将已连接的套接字分配给 boost::asio 套接字,然后继续享受增强功能。

从下面的链接中,您可以找到如何使用分配 API。

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_stream_socket/assign/overload1.html

如果您有任何疑问,请告诉我。

编辑:

现在,如果您的问题是关于非阻塞读取,因为 async_read_some 是非阻塞的,那么使用 read_some 如下

boost::asio::async_read(*p_socket, boost::asio::buffer(&buffer[index], remaining_len2read), read_handler);

上面的 API 是阻塞的,在接收到所有数据之前不会返回。

于 2013-10-24T08:27:14.027 回答
1

问题在于我正在使用的动态链接。作为问题的答案,tcp::socket::assign在连接的套接字上可以正常工作。

于 2013-10-25T19:11:54.147 回答