草庐IT

C++ 模拟/测试 boost::asio::io_stream - 基于异步处理程序

在多年使用C#之后,我最近又回到了C/C++。在那些年里,我发现了模拟和单元测试的值(value)。在C#中查找模拟和单元测试的资源很简单。WRTMocking,而不是C++。我想要一些关于其他人如何使用boost来模拟和测试异步io_service处理程序的指导。例如,在C#中,我会使用MemoryStream来模拟IO.Stream,并假设这是我应该采用的路径。C++模拟/测试最佳实践boost::asio::io_service模拟/测试最佳实践C++异步处理程序模拟/测试最佳实践我已经使用googlemock和googletest开始了这个过程。 最

c++ - 单元测试和 boost::asio

我正在使用boost::asio编写小型XMPP服务器,我想对我的代码进行单元测试。问题:是否有一些现成可用的框架?据我所知,我需要为boost::asio类/模板提供模拟对象,我真的很想(半)自动地做到这一点。是否可以测试并发性(例如,与服务器的多个连接以及它们之间的消息路由)? 最佳答案 1)我写了一个小的套接字类,可以用来替代boost::asio::ip::tcp::socket。如果愿意,可以查看robitzki.de/test_socket.h(test_socket.cpp、test_io_plan.h和test_io

c++ - 带有 boost::asio 的 TCP 服务器,线程池的可扩展性与无堆栈协程

我正在构建一个基于TCP的守护进程,用于对HTTP请求进行预处理/后处理。客户端将连接到ApacheHTTPD(或IIS),自定义Apache/IIS模块将请求转发到我的TCP守护程序以进行进一步处理。我的守护进程需要扩展(但不是扩展)以处理大量流量,而且大多数请求都是小而短暂的。守护进程将使用C++构建,并且必须是跨平台的。我目前正在研究boostasio库,它看起来很适合。但是,我无法理解无堆栈协程与线程池模式的优点。具体来说,我在这里查看HTTP服务器示例#3和HTTP服务器示例#4:http://www.boost.org/doc/libs/1_49_0/doc/html/bo

c++ - boost::asio 中 async_read() 中的 EOF

当async_read_some()返回EOF异常时,是服务器停止发送数据还是连接已关闭。我有这种困惑,因为我找不到一种方法来知道客户端是否已从服务器接收到所有数据。 最佳答案 表示连接已经关闭。虽然记录了elswhere它仍然适用:Anerrorcodeofboost::asio::error::eofindicatesthattheconnectionwasclosedbythepeer.如果客户端需要知道已经从服务器接收到所有数据,那么可以考虑在通信协议(protocol)中支持分帧。Boost.Asio提供更高级别的操作来帮

c++ - boost::asio,线程和同步

这与thisquestion有些相关,但我想我需要了解更多。几天来,我一直在努力思考如何做到这一点(同时处理其他部分),但现在是我硬着头皮使用多线程的时候了。另外,我需要的信息比链接的问题多一些。首先,关于多线程。因为我一直在测试我的代码,所以我没有为任何多线程而烦恼。它只是一个控制台应用程序,它启动与测试服务器的连接,然后处理其他所有内容。主循环是这样的:while(true){Root::instance().performIO();//callsio_service::runOne();}当我编写我的主应用程序时,我猜这个解决方案是NotAcceptable(因为它必须在消息循环

c++ - boost:asio 线程池实现,用于偶尔同步的任务

我有一个“主要”函数,它在每个时间步执行一次许多小的、独立的任务。但是,在每个时间步之后,我必须等待所有任务完成才能继续。我想让程序多线程化。我尝试过使用boost-offshoot线程池实现,我尝试过使用线程的(共享指针)vector,我尝试过asio线程池的想法(使用io_service,建立一些工作,然后将运行分发到线程并将处理程序发布到io_service)。所有这些似乎都有很多开销为我的“许多小任务”创建和销毁线程,我想要一种方法,最好使用asio工具,来实例化一个io_service,一个thread_group,将处理程序发布到io_service,并在发布更多任务之前等

c++ - 如何指定要在用 C++ 编写的应用程序中使用的特定 NIC (boost asio)

我有一台机器连接到多个独立网络,每个网络都在不同的NIC(网络接口(interface)卡)上。机器运行Windows7。我在需要使用TCP通过特定NIC连接到特定IP的机器上运行应用程序。该应用程序使用c++11和boostasio(1.53.0)进行联网,源码可以更改。在Windows环境下解决这个问题(指定端点IP和网卡)有哪些不同的合理方式?当前的解决方案将相应的(block)IP分配给路由表中正确的NIC-通过使用命令行“route”命令-作为持久路由。操作系统以这种方式处理问题,这是允许的,但不是必需的。 最佳答案 你应

c++ - 间歇性地没有数据通过 boost::asio/io 完成端口传递

问题我正在使用boost::asio对于同一台机器上的两个进程使用TCP/IP进行通信的项目。一个生成数据供另一个读取,但我遇到了间歇性地没有数据通过连接发送的问题。我将其归结为下面一个非常简单的示例,基于asynctcpechoserverexample.流程(下面的源代码)开始时运行良好,以快速的速度将数据从发送方传送到接收方。然后突然间,在大约五秒钟内根本没有传送任何数据。然后再次传送数据,直到下一次莫名其妙的停顿。在这五秒钟内,进程消耗0%CPU,并且似乎没有其他进程做任何特别的事情。停顿的长度始终相同-五秒。我正试图弄清楚如何摆脱这些摊位以及造成这些摊位的原因。整个运行期间的

c++ - 在 boost::asio::serial_port 上解锁同步读取

我有一个boost::thread,它在boost::asio::serial_port上执行同步读取。当我销毁包含这两者的类的实例时,我希望线程能够优雅地结束,即使它在读取调用中被阻塞也是如此。我该怎么做?查看docs,我试过cancel,但它只适用于异步读/写。然后我尝试了close,但我得到了一个异常,它不是你可以从中恢复的那种。也许使用send_break或native_handle?(这是Windows,可移植性并不重要)更新:我还尝试停止传递给串行端口对象构造函数的io_service,但是读取code>没有解锁。编辑:异常实际上是“可捕获的”,但我不想在析构函数中放置一个

c++ - 如何在 Windows 中使用 boost asio 从命令行异步读取输入?

我找到了thisquestion它询问如何异步读取输入,但只适用于POSIX流描述符,这在Windows上不起作用。所以,我找到了thistutorial这表明我可以使用boost::asio::windows::stream_handle而不是使用POSIX流描述符。根据这两个示例,我想出了下面的代码。当我运行它时,我无法在命令提示符中键入任何内容,因为程序会立即终止。我希望它捕获来自用户的任何输入,可能到std::string中,同时允许我的程序中的其他逻辑执行(即从Windows控制台执行异步I/O)。本质上,当我的程序试图从stdin中读取时,我试图避免阻塞我的程序。我不知道这