草庐IT

asio-acceptor

全部标签

c++ - io_service::strand 的 num_implementations 背后的 boost::asio 推理

我们已经在生产环境中使用asio多年了,最近我们达到了一个临界点,我们的服务器负载刚好足以注意到一个神秘问题。在我们的架构中,每个独立运行的独立实体都使用个人strand对象。一些实体可以执行长时间的工作(从文件读取、执行MySQL请求等)。显然,这项工作是在用strand包裹的处理程序中执行的。一切听起来都不错,应该可以完美地工作,直到我们开始注意到一些不可能的事情,比如计时器在它们应该过期的几秒钟后过期,即使线程正在“等待工作”并且工作无缘无故地停止。看起来在一条链中执行的长时间工作对其他不相关的链产生了影响,不是全部,而是大多数。花费了无数个小时来查明问题。该轨道导致strand

c++ - 可以使用 boost::asio::thread_pool 来代替 boost::asio::io_context 与 boost::thread::thread_group 的组合吗?

我正在努力解决我的一些困惑。我偶然发现了boost::asio::thread_pool并且我认为可以使用以某种方式自动组合boost::asio::io_context和boost::thread::thread_group就像经常建议的那样(here或here)。似乎这个asio特定的池可用于post任务,但另一方面,一些网络类型,如resolver需要将对象io_context作为构造函数参数传递,而thread_pool不是也不是从该参数派生的。 最佳答案 假设你有一个单独的io_context对象,名为ioc。您可以创建多

c++ - 使用 boost::asio 时如何防止 SIGPIPE?

我正在使用管道在Gnu/Linux上的两个进程之间进行通信。接收端关闭管道,而发送端仍在尝试发送数据。这是一些模拟这种情况的代码。#include#includeintmain(){intpipe_fds[2];if(::pipe(pipe_fds)!=0)return1;//closethereceivingend::close(pipe_fds[0]);boost::asio::io_serviceio;boost::asio::posix::stream_descriptorsd(io,pipe_fds[1]);boost::system::error_codeec;sd.wri

c++ - boost::asio::ip::tcp::resolver::iterator 是做什么的?

我从C++中的boostasio编程开始,在查看示例时,我无法理解boost::asio::ip::tcp::resolver::iterator是什么做。代码:boost::asio::io_serviceio_service;tcp::resolverresolver(io_service);tcp::resolver::queryquery(argv[1]);tcp::resolver::iteratorendpoint_iterator=resolver.resolve(query);tcp::resolver::iteratorend;tcp::socketsocket(io

c++ - asio::read with timeout

我需要知道如何在超时时读取(同步或异步无关紧要)。我想检查设备是否与串行端口连接。为此,我使用asio::write然后等待设备的响应。如果连接了设备asio::read(serial,boost::asio::buffer(&r,1))工作正常,但如果没有设备,程序将停止,即为什么我需要超时我知道我需要一个deadline_timer但我不知道如何在async_read函数中使用它。举例说明它的工作原理会很有帮助。我知道有很多类似的主题,我阅读了很多,但我找不到可以帮助我解决问题的解决方案! 最佳答案 codepostedbyIg

c++ - 使用 Boost.Asio 执行干净关机的标准方法

我正在使用Boost.Asio用C++编写一个跨平台的服务器程序。遵循thispage,上的HTTP服务器示例我想在不使用特定于实现的API的情况下处理用户终止请求。我最初尝试使用标准C信号库,但一直无法找到适合Asio的设计模式。Windowsexample's设计似乎与最接近的信号库相似,但存在一种竞争条件,即在服务器对象被销毁后可以调用控制台ctrl处理程序。我试图避免C++标准规定的未定义行为。是否有标准(且正确)的方式来停止服务器?为了说明使用C信号库的问题:#include#include#includeusingstd::signal;usingboost::asio::

c++ - Boost.asio 和 UNIX 信号处理

前言我有一个通过Boost.Asio运行的多线程应用程序。整个应用程序只有一个boost::asio::io_service,所有的事情都由一组线程在其中完成。有时需要使用fork和exec生成子进程。当child终止时,我需要对其进行waitpid以检查退出代码并收集僵尸。我使用了最近添加的boost::asio::signal_set但在带有linux-2.4.*内核的古老系统下遇到了问题(不幸的是,一些客户仍在使用)。在较旧的linux内核下,线程实际上是进程的一种特殊情况,因此如果一个子线程由一个线程产生,另一个线程无法使用waitpid系列系统调用来等待它。Asio的sign

c++ - 使用streambuf作为缓冲区来 boost asio读写

我正在使用此代码阅读socket_.async_read_some(boost::asio::buffer(data_,max_length),boost::bind(&session::handle_read,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));这就是写作boost::asio::async_write(socket_,boost::asio::buffer(data_,bytes_transferred),boost::bind(&session::

c++ - boost::asio io_service 线程池

为io_service设置线程池的正确用法是什么?这两条语句来自documentation把我甩了:io_service::runAnormalexitfromtherun()functionimpliesthattheio_serviceobjectisstopped(thestopped()functionreturnstrue).Subsequentcallstorun(),run_one(),poll()orpoll_one()willreturnimmediatelyunlessthereisapriorcalltoreset().io_service::resetThisf

c++ - Boost.Asio 与谷歌 Protocol Buffer

我目前正在研究如何改进我们当前的c++网络手工序列化机制,以维护我们现有的二进制协议(protocol)。采用的第一种方法是使用Boost.Asio和Boost.Serialisation使用二进制序列化对其进行编码。无论如何,事实证明它比我们当前的手工实现要慢一些(10%)。任何人都有关于使用googleprotobuf和Boost.Asio的实际_real_work_经验?我在谷歌上搜索了示例,但只能想出这个示例:BoostAsiowithgoogleprotocolbufferssample有人在任何实际项目中这样做过吗?我对性能数据非常感兴趣,因为这必须非常快......