c++ - 如何在 Boost.ASIO 中分配一个已经连接的本地套接字类型(TCP)

标签 c++ linux sockets boost boost-asio

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

尝试发送一个请求; ip::tcp::socket::assign 在 2 个不同的地方随机给出 2 个不同的段错误。一个是在调用回调之前(在 op_queue_acess::next 上),另一个是在回调之后(在 boost::asio::detail::task_io_service_operation::complete 上(func_等于 0 并尝试执行))。所以我猜它不适用于已连接的套接字。

编辑:

情况是,我有一个已连接的 native 描述符(实际上是另一个库下的一个套接字),我想将它分配给一个新的空 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 套接字,然后享受 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 是阻塞的,直到接收到所有数据后才会返回。

关于c++ - 如何在 Boost.ASIO 中分配一个已经连接的本地套接字类型(TCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19553206/

相关文章:

c++ - 三十部分库中的线程安全

c++ - 发送错误 : Invalid argument

c++ - 将类字段传递给成员函数

linux - CMake如何使用pkg-config来查找包?

regex - 如何从文件中删除与正则表达式不匹配的行?

linux - 如何正确等待 yum lock 被释放?

java - Android:BluetoothSocket 连接抛出 IOException

java - 无法通过 Java 套接字发送消息而不关闭它

c++ - 为什么矩阵加法比 Eigen 中的矩阵向​​量乘法慢?

c++从文件中读取加倍,但如果程序遇到字符串则记录