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

时间:2013-10-23 22:06:20

标签: 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并尝试执行))。所以我猜它不适用于连接的套接字。

编辑:

案例是,我有一个连接的本机描述符(实际上是另一个库下的套接字),我想将它分配给一个新的空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并分配给套接字,但仍然提升为segfaults。是因为io_service是在一个动态加载的库中,而socket是在另一个动态加载的库中,并且在主库上引用了io_service?

2 个答案:

答案 0 :(得分:1)

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

从下面的链接中,您可以找到如何使用assign 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是阻止的,在收到所有数据之前不会返回。

答案 1 :(得分:1)

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