【发布时间】: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 我已经编辑了问题。
-
@SamMiller 该示例中的第三方库也使用 ip::tcp::socket。我无法修改库以使用 ip::tcp::socket。该库使用本地方法完成所有连接等操作,并为我提供了设置阻塞状态的选项和获取 fd 的函数。当我调用 library_connect() 方法时,我不知道库除了连接到服务器之外还做了什么,所以我必须以某种方式将连接的套接字放入 asio 循环。
-
例子就是这样,一个例子。它并不打算涵盖所有第三方库。空缓冲区概念旨在解决您的问题。请编辑您的问题以包含演示您的问题的代码。
标签: c++ linux sockets boost boost-asio