如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)

Posted

技术标签:

【中文标题】如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)【英文标题】:How to assign an already connected native socket type (TCP) in Boost.ASIO 【发布时间】:2013-11-02 09:49:18 【问题描述】:

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

尝试发送一个请求; ip::tcp::socket::assign 在 2 个不同的地方随机给出 2 个不同的段错误。一种是在调用回调之前(op_queue_acess::next),另一种是在回调之后(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 在一个动态加载的库中,而 socket 在另一个动态加载的库中,并且引用了主库上的 io_service?

【问题讨论】:

您的问题不清楚。您有一个现有的本机描述符,要分配给已连接的boost::asio::ip::tcp::socket @SamMiller 我已经编辑了问题。 有一个 example 显示 Asio 文档中包含的反应器样式操作。还有similar关于SO的问题。请在您的问题中包含您的代码,以便我们提供帮助。 @SamMiller 该示例中的第三方库也使用 ip::tcp::socket。我无法修改库以使用 ip::tcp::socket。该库使用本地方法完成所有连接等操作,并为我提供了设置阻塞状态的选项和获取 fd 的函数。当我调用 library_connect() 方法时,我不知道库除了连接到服务器之外还做了什么,所以我必须以某种方式将连接的套接字放入 asio 循环。 例子就是这样,一个例子。它并不打算涵盖所有第三方库。空缓冲区概念旨在解决您的问题。请编辑您的问题以包含演示您的问题的代码。 【参考方案1】:

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

您可以从以下链接了解如何使用分配 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是阻塞的,直到收到所有数据才会返回。

【讨论】:

我确实使用过它,但当我使用它时,它会在 ASIO 函数上出现段错误。我认为“ASIO 连接”不仅仅是连接和分配还不够,是这样吗? 这不正确,OP 想使用null_buffers 并让库处理从本机套接字读取数据。 您(@Tolga)使用null_buffers有什么具体原因吗?? @ChiragDesai 是的,图书馆应该读取和处理数据。【参考方案2】:

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

【讨论】:

以上是关于如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio 完全断开连接

为啥在使用 boost::asio 时每个连接都需要 strand?

boost::asio - 知道何时必须关闭/关闭连接

如何在 boost asio 中设置阻塞套接字的超时时间?

如何将此 Boost ASIO 示例应用于我的应用程序

boost::asio 无法干净地关闭 TCP 连接