草庐IT

asio_handler_invoke

全部标签

c++ - boost::asio 接受器避免内存泄漏

使用boost::asio我使用async_accept接受连接。这很好用,但有一个问题,我需要一个如何处理它的建议。使用典型的async_accept:Listener::Listener(intport):acceptor(io,ip::tcp::endpoint(ip::tcp::v4(),port)),socket(io){start_accept();}voidListener::start_accept(){Request*r=newRequest(io);acceptor.async_accept(r->socket(),boost::bind(&Listener::ha

c++ - boost::asio::streambuf 缩小到适合?

boost::asio::streambuf的大小会一直增加,直到consume()被调用。即使在调用consume()之后,底层缓冲区使用的内存也永远不会被释放。例如:下面的代码首先创建了一个没有指定max_size的streambuf。然后它将14Mb数据转储到streambuf中。然后它消耗所有这些14MB数据。在2000点,streambuf.size()为0,但“top”显示进程仍占用14MB内存。我不想指定max_size。streambuf为空后,有什么方法可以收缩它吗?#include#include#includeintmain(){{boost::asio::str

c++ - Boost.Asio - 确保对方收到数据

我正在使用boost::asio并向客户端发送列表并在完成后关闭套接字。不知何故,客户端有时在收到所有内容之前收到文件结束错误。我猜这与服务器在发送最后一个列表条目后立即关闭套接字有关。async_send只有在数据发送成功后才调用handler,有什么简单的方法可以解决吗?或者我的文件结束错误来自其他原因? 最佳答案 Boost.Asio是基于TCP和UDP套接字的独立于操作系统的抽象层。它们不保证其他应用程序已接收并处理数据。您需要在您的应用程序中包含此逻辑,您可能需要研究OSImodel.如果您在async_send()返回后

c++ - boost::asio::ssl::context::add_verify_path

我想验证服务器的证书。我有一个boost::asio::ssl::context这成功验证了证书:context.load_verify_file("E:\\a\\windows\\Path\\to\\certificate\\9207bca9.0");但是,我不想明确指定用于验证证书的文件。我希望能够将它们放在一个目录中,并告诉上下文使用该文件夹中的文件来验证证书。所以我改为这样做:context.add_verify_path("E:\\a\\windows\\Path\\to\\certificate");验证不成功注意:文件名9207bca9.0:9207bca9是CA证书主题

c++ - boost::asio::deadline_timer 没有唤醒(压力场景)

我正在使用deadline_timer作为异步事件,我遇到了这样一种情况,一段时间后,等待该事件的线程似乎永远不会被唤醒(尽管对cancel()的调用更多)。我已经能够使用我在下面粘贴的一些示例代码来重现它;它并不完全一致,但我已经看到我认为与我遇到的问题相同。boost::asio::io_serviceio_service;boost::asio::deadline_timertimer(io_service);timer.expires_at(boost::posix_time::pos_infin);intnum_events=0;autowaiter=[&timer,&num

java - JNI : Invoke JAVA method from C++, 返回对象、引用和 GC

当C++程序(!)调用返回对象的java方法时,规则是什么?是否有对该对象的突出引用?我必须调用“DeleteLocalRef”来确保该对象是GCd,还是会自动成为GCd?我不清楚的原因是,在所有示例和官方文档中,声明“DeleteLocalRef”不是必需的,只有当从java调用native“C/C++”方法时,它对我才有意义。但是如果调用线程是调用java的C++方法,JVM怎么知道这个对象可以GCd呢?同理:如果我想缓存对象,我必须调用“NewGlobalRef”吗?找不到对此的任何引用...感谢任何引用和/或澄清 最佳答案

c++ - Boost.asio 和异步链,unique_ptr?

我对异步编程不是很熟悉,我有一个问题。我的问题如下。给定boost.asio中C++11的echo_server示例:http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp我想知道std::make_shared可以在C++14中替换为std::unique_ptr在C++14中,避免了引用计数的开销。我不确定,因为我们有shared_from_this()但不是像unique_from_this()这样的东西,那么我怎样才能访问unique_ptr从里面t

c++ - Boost::asio 套接字 - 如何干净地断开它们?

我正在为我的服务器应用程序使用boost异步套接字。我创建了一个调用boost的close()的disconnect()函数,然后删除套接字(操作符删除)。当从其中一个异步调用该函数时没关系。处理程序,但是当我从我的主代码库内部调用它时,整个应用程序在其中一个异步处理程序处崩溃。如何在boost中很好地关闭一个socket? 最佳答案 确保只要可能使用它的处理程序存在,该对象就一直存在。很可能在您调用close之后调用了使用此套接字的处理程序之一(因为它向处理程序报告错误)然后访问死指针...通常,使用boost::shared_p

c++ - boost::asio::streambuf 断言 "iterator out of bounds"

客户端向服务器发送大约165kB的数据。起初一切都很好。但是当客户端再次发送相同的数据(165kB)时,我在服务器端收到一个断言。断言包含有关“迭代器越界”的信息在调用堆栈上,有一些关于read_until方法的信息。所以我认为我犯了一个错误。TCP异步服务器代码如下:handle_read代码:voidSession::handle_read(constboost::system::error_code&a_error,size_ta_nbytestransferred){if(!a_error){std::ostringstreamdataToRetrive;dataToRetri

c++ - Boost::asio socket - 如何在 'throw' 中创建 read_some "timeout"?

所以通常我们会做这样的事情socket.read_some(boost::asio::buffer(buffer,buffer_size));但是如何让它在读取还没有开始的情况下抛出异常比说333秒更长的时间? 最佳答案 您应该考虑使用async_read_some而不是read_some,因为它允许您在读取的同时启动一个新的后台计时器。然后,为您执行的每个新套接字创建一个新计时器:boost::asio::io_serviceio_service;time_t_timertimer(io_service);timer.expire