问题标签 [boost-asio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
255 浏览

c++ - 消息顺序不正确(使用 io_service::wrap)

我有一个 GUI 连接并接收大量消息的应用程序,问题是它每隔一段时间就会收到一条乱序的消息。

该连接在单独的工作线程(单独的io_service)上运行,并将send函数(执行 a async__writeio_service::wrap作为回调公开,以供其他人使用字符串消息作为参数进行调用。(即callback = io_service_.wrap(boost::bind(&SomeGUIClass::send,this,_1));),

所以要向 GUI 客户端发送一些东西,其他人调用- 它应该正确地在's 的队列callback(stringMessage)上调度发送函数调用。io_service

在调用之前,消息的顺序是正确的,但我可以看到,有时它们在 write 调用之前callback是无序的。callback

我的推理: wrap 转换为 adispatch将尝试调用已包装的 fn。内callback(如果它可以满足线程安全保证),如果不能,则将其安排在以后。因此,有时较早的消息会被安排用于稍后的写入,而最新的消息会得到处理,因为 dispatch 能够在同一时间处理它callback。请让我知道这个推理是否正确,任何想法表示赞赏。谢谢!

0 投票
3 回答
736 浏览

c++ - 我有一个监听套接字的服务器,有什么好的方法可以用多个线程来服务 CPU 绑定的请求?

我有一个用 C++ 编写的应用程序,它使用 boost::asio。它侦听套接字上的请求,并为每个请求执行一些 CPU 绑定的工作(例如,没有磁盘或网络 I/O),然后以响应响应。

该应用程序将在多核系统上运行,因此我计划每个内核(至少)1 个线程来并行处理请求。

这里最好的方法是什么?需要考虑的事情:

  • 我需要一个固定大小的线程池(例如每个 CPU 1 个线程)
  • 如果到达的请求比我拥有的线程多,那么它们需要排队(可能在 o/s 套接字层?)

目前服务器是单线程的:

  • 它等待客户端请求
  • 一旦收到请求,它就会执行工作,并将响应写回,然后开始等待下一个请求

更新:

更具体地说:我应该使用什么机制来确保如果服务器很忙,传入的请求会排队?我应该使用什么机制在 N 个线程(每个核心 1 个)之间分配传入请求?

0 投票
2 回答
1374 浏览

http - HTTP 服务器(使用套接字)应该如何检测客户端不再连接并中止处理?

我正在使用 boost::asio 在 C++ 中实现一个基本的 HTTP 服务器。

在处理每个请求时,我会以异步方式将数据分块写入。如果在任何时候我知道客户端不再连接,我想中止处理,例如,如果客户端不再存在,则继续构建结果以发送出去是没有意义的。

我认为这已经在这里被问过几次了,例如:

如何检查客户端是否通过 C++ 中的 Winsock 断开连接?

但是我读了它们,我仍然不确定这里有什么好的方法。

  • 我可以尝试从客户端套接字读取吗?(即使知道另一端的 HTTP 客户端不会发送任何数据)
  • 因为我正在异步编写(使用 boost::asio::async_write),所以如果客户端不再存在,我似乎不会收到反馈
0 投票
1 回答
2154 浏览

asynchronous - 提升 asio 异步与阻塞读取、udp 速度/质量

我有一个用 C# 编写的快速而肮脏的概念证明应用程序,它从网络读取高数据速率多播 UDP 数据包。由于各种原因,完整的实现将用 C++ 编写,我正在考虑使用 boost asio。C# 版本使用线程通过阻塞读取来接收数据。如果计算机负载很重(通常在另一个线程中处理这些数据包),我会遇到一些丢弃数据包的问题。

我想知道的是 boost 中的异步读取操作(在 windows 中使用重叠 io)是否有助于确保我接收数据包和/或减少接收数据包所需的 cpu 时间。执行阻塞读取的单线程非常简单,使用异步读取似乎更复杂,但我认为如果它提供更高的性能或在重负载系统上丢弃更少的数据包,那将是值得的。目前数据速率应不高于 60Mb/s。

0 投票
3 回答
1977 浏览

c++ - C++ mysql和boost asio头冲突

mysql c-api 和 boost::asio 之间的 windows 标头似乎存在冲突。

如果我首先包含 mysql,我会得到:

boost/asio/detail/socket_types.hpp(27) : 致命错误 C1189: #error : WinSock.h 已经包含在内

如果我首先包含 boost::asio 我得到:

include\config-win.h(24) : 警告 C4005: '_WIN32_WINNT' : 宏重新定义

有没有办法解决这个问题,为什么mysql试图强制windows版本和boost试图强制它包含winsock它自己呢?

0 投票
2 回答
5154 浏览

boost-asio - 应该如何拆除 boost::asio::ip::udp::socket?

我已经阅读了 boost asio 参考,浏览了教程并查看了一些示例。尽管如此,我还是看不到应该如何拆除套接字:

  1. 我应该调用 close() 还是由套接字的析构函数完成?
  2. 我什么时候应该调用 shutdown()
  3. shutdown() 的作用是什么?我知道它“禁用发送或接收”,但这是如何完成的?如果在禁用套接字后使用套接字发送或接收,我会期待什么?
  4. 我可以从 close() 中得到哪些错误
0 投票
2 回答
7545 浏览

c++ - boost::asio,异步读取错误

出于某种原因,这会导致访问冲突,但是没有任何详细的文档/帮助我不确定我在哪里做错了。由于按照我在 boost 站点上看到的内容,这应该是正确的,并将客户端的每个 asio::write 调用的内容打印到新行。客户端似乎工作正常。虽然此时服务器崩溃了,但它还没有发送任何东西。

访问冲突发生在第 275 行的 basic_stream_socket.hpp 中。原因似乎是对象 (boost::asio::stream_socket_service) 未初始化(this 指针的值为 0xfeeefeee),但我不明白为什么不是。

程序输出:

启动服务器
Server::startAccept()
Server::handleAccept()
连接已接受
Connection::startRead()
Server::startAccept()
Connection::handleRead()
读取错误: I/O 操作已中止,因为线程退出或应用程序请求
Connection::startRead()

编码

0 投票
1 回答
3107 浏览

c++ - Boost::Asio 读/写操作

调用/成员函数和调用/自由函数有boost::asio::ip::tcp::socket什么区别?read_somewrite_someboost::asio::readboost::asio::write

进一步来说:

使用其中一个有什么好处吗?

为什么两者都包含在库中?

0 投票
6 回答
14091 浏览

c++ - C++ 套接字服务器 - 无法使 CPU 饱和

我使用 boost::asio 在 C++ 中开发了一个迷你 HTTP 服务器,现在我正在使用多个客户端对其进行负载测试,但我一直无法接近 CPU 饱和。我在 Amazon EC2 实例上进行测试,一个 cpu 的使用率约为 50%,另一个 cpu 的使用率为 20%,其余两个处于空闲状态(根据 htop)。

细节:

  • 服务器每个核心启动一个线程
  • 接收、解析、处理请求并写出响应
  • 请求是从内存中读取的数据(本测试只读)
  • 我正在使用两台机器“加载”服务器,每台机器运行一个 java 应用程序,运行 25 个线程,发送请求
  • 我看到大约 230 个请求/秒的吞吐量(这是应用程序请求,由许多 HTTP 请求组成)

那么,我应该看什么来改善这个结果呢?鉴于 CPU 大多处于空闲状态,我想利用额外的容量来获得更高的吞吐量,比如 800 个请求/秒或其他什么。

我有过的想法:

  • 请求非常小,通常在几毫秒内完成,我可以修改客户端以发送/组合更大的请求(可能使用批处理)
  • 我可以修改 HTTP 服务器以使用 Select 设计模式,这适合吗?
  • 我可以做一些分析来尝试了解瓶颈是什么
0 投票
2 回答
14151 浏览

c++ - C++ 使用命名管道

由于某种原因,桅杆和奴隶都失败了,但是我可以找到任何关于它们如何工作的好例子,所以我不确定我哪里出错了。

主机在 ConnectNamedPipe 之后永远不会退出 WaitForSingleObject,从机在第一个 boost::asio::read 调用中抛出异常,“等待进程打开管道的另一端”,我认为 WaitNamedPipe 是为了与 Master 中的 ConnectNamedPipe 一起等待?

大师.cpp

从属.cpp

显然我得到了一些完全错误的东西,但是我在网上找不到任何东西来比较我的代码。