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

C++ 如何在Boost.ASIO中分配已连接的本机套接字类型(TCP),c++,linux,sockets,boost,boost-asio,C++,Linux,Sockets,Boost,Boost Asio,是否有一种方法允许在ASIO中使用已连接的套接字 试图发送一个请求ip::tcp::socket::assign在两个不同的位置随机给出两个不同的SEGFULT。一个在调用回调之前(在op\u queue\u acess::next),另一个在回调之后(在boost::asio::detail::task\u io\u service\u operation::complete(func\u等于0并尝试执行))。所以我猜它不适用于连接的插座 编辑: 情况是,我有一个已连接的本机描述符(实际上是另

是否有一种方法允许在ASIO中使用已连接的套接字

试图发送一个请求<代码>ip::tcp::socket::assign在两个不同的位置随机给出两个不同的SEGFULT。一个在调用回调之前(在
op\u queue\u acess::next
),另一个在回调之后(在
boost::asio::detail::task\u io\u service\u operation::complete
(func\u等于0并尝试执行))。所以我猜它不适用于连接的插座

编辑:

情况是,我有一个已连接的本机描述符(实际上是另一个库下的套接字),我想将它分配给一个新的空ip::tcp::socket,以便在套接字准备就绪时(使用带有空缓冲区的
socket::async\u read\u 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会产生seg错误,有时是在调用回调之后,有时是在调用回调之前

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

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

从下面的链接中,您可以找到如何使用AssignAPI

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

编辑:

现在,如果您的问题是非阻塞读取为异步读取,那么请按如下方式使用读取

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

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

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

您的问题不清楚。您有一个现有的本机描述符,要分配给已连接的
boost::asio::ip::tcp::socket
?@SamMiller我已经编辑了这个问题。在asio文档中有一个显示反应堆样式操作的示例。还有这样的问题。请在问题中包含您的代码,以便我们提供帮助。@SamMiller该示例中的第三方库也使用ip::tcp::socket。我无法修改库以使用ip::tcp::socket。该库使用本机方法进行所有连接等操作,并为我提供了设置阻塞状态的选项和获取fd的函数。当我调用library_connect()方法时,我不知道库除了连接到服务器之外还能做什么,所以我必须以某种方式将连接的套接字放入asio循环中。它并不打算为每一个第三方库提供全面的服务。空缓冲区概念旨在解决您的问题。请编辑您的问题,包括代码演示您的问题。我确实使用了它,当我这样做时,它会给出ASIO函数的SEGFULTS。我认为“ASIO connect”做的不仅仅是连接,分配做的还不够,是真的吗?这是不对的,OP想要使用
null\u缓冲区
,让库处理从本机套接字读取的数据。你(@Tolga)使用
null\u缓冲区
有什么具体原因吗?@ChiragDesai是的,图书馆应该读取和处理这些数据。