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

How to assign an already connected native socket type (TCP) in Boost.ASIO

本文关键字:套接字 本机 类型 TCP 连接 Boost ASIO 分配      更新时间:2023-10-16

有没有办法允许在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会给出所述 seg 错误,有时是在回调之后,有时是在调用之前。

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

您可以将已经连接的套接字分配给 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 正在阻塞,在收到所有数据之前不会返回。

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