如何在 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)的主要内容,如果未能解决你的问题,请参考以下文章