问题标签 [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.
c++ - 使用 ASIO 捕获大量 UDP 数据包
我正在使用 asio(非 boost 版本)库通过 10GB 以太网适配器捕获传入的 UDP 数据包。每秒 150k 个数据包很好,但是当我达到更高的速率(例如 300k 个数据包/秒)时,我开始丢弃数据包。
我很确定瓶颈在于 DMA 从网卡到主机系统的 300k 单独传输。传输并不大,每次传输只有 1400 字节,所以不是带宽问题。
理想情况下,我想要一种机制来将来自多个数据包的数据合并到一个到主机的单个 DMA 传输中。目前我正在使用 asio::receive 进行同步传输,它提供比 async_receive 更好的性能。
我曾尝试使用带有更大缓冲区的接收命令,或使用多个缓冲区的数组,但我似乎总是获得 1400 字节的单次读取。
有没有办法解决?
理想情况下,我想一次读取 1400 个字节的多个字节,只要填充总数不需要太长时间。IE。等待最多 4 毫秒,然后返回 4 x 1400 字节,或者只是在 4 毫秒后返回,但有多少字节可用......
我不控制整个网络,所以我不能强制使用巨型帧:(
干杯,
c++ - 提升 asio async_read 延迟(本地套接字)
我在使用 boost asio 进行套接字编程时遇到问题。
我的程序流程如下:
客户端使用 async_write 向服务器发送数据,然后它将使用 async_read 从服务器接收数据。所有异步操作的处理程序都是 use_future,超时 = 2 秒。
问题是:
服务器的处理时间约为 10 毫秒。服务器和客户端都在同一台计算机上,因此客户端应该在服务器发送数据时接收数据。但是,我测量了 async_read 的延迟,发现其中一些约为 10 毫秒,而另一些约为 30 ~ 40 毫秒。通常,它们是交错的。
我如何测量:
我尝试了 2 个解决方案:
- 为 boost::asio::streambuf 分配更大的空间。我分配了 4096 字节,我的数据大小从未超过 1500 字节,但它不起作用。
- 用于
socket_.set_option(ip::tcp::no_delay(true));
关闭 Nagle 的算法和延迟确认。此外,它无法工作。
我不知道这个问题。任何人都可以帮助我吗?请...
更新:这是我的部分源代码
下面是向服务器发送请求的代码:
下面是从服务器接收数据的代码。
boost - FIPS OpenSSL 是否与 Boost ASIO 一起使用?
我已经使用 OpenSSL 版本 1.0.2d 构建了 fips 模式 OpenSSL,并且使用版本 2.0.13 构建了 fips 容器。整个过程成功编译并链接,以创建 Windows 32 位版本的 libeay32 和 ssleay32 lib 和 dll 文件。
我创建了一个可以正确运行的小示例程序(只是 VS2010 中的控制台程序)——只需将 OpenSSL 设置为 fips 模式并在出现任何问题时打印错误。
但是,当我在实际程序中链接那些相同的 lib/dll 文件时,我正在开发的东西根本不起作用。该程序是加载 dll 模块以实现功能的可执行文件。这些 dll 模块之一是链接到 OpenSSL 库的模块。该 dll 模块也使用 Boost asio。当我的程序启动时,它无法加载自己的使用 OpenSSL dll 的 dll 模块。
我认为可能存在阻止加载的依赖问题(未找到的东西)。这就是导致我创建小型控制台示例的原因。它使用相同的链接设置和文件工作。
如果我在没有 fips 容器的情况下构建 OpenSSL - 只是“常规”OpenSSL 版本 1.0.2d,则生成的 lib/dll 文件在我的应用程序中工作正常。
所以,我想知道 boost 库可能正在做的事情是否会阻止 fips OpenSSL dll 正确加载。
有没有人听说过这样的事情?
谢谢。
ssl - 这个错误error:140000DB:SSLroutines:SSLroutines:short read是什么意思
在我们的软件中,我们不断收到此警告/错误消息。不确定此消息如何/为何出现。
HTTP asio 握手失败:错误:140000DB:SSL 例程:SSL 例程:短读
我在互联网上搜索,但大多数结果指向我的 VMware 问题。对我来说不是这样。
直到我发现实际上这个错误是由 Boost-Asio 使用的 OpenSSL 引发的。我已经下载了 OpenSSL/Asio/Boost 的源代码,但是在源代码中找不到这个错误代码。我的问题,有谁知道这个错误是什么意思?此错误消息的触发因素可能是什么?我只是想了解一下以找出复制品。因此,如果软件中有任何漏洞,我们可以修复我们的软件。
提前谢谢了!
参考:http: //ib-krajewski.blogspot.my/2016/03/https-support-for-casablanca-client.html
c++ - 使用 Asio 在 Windows 上出现的奇怪错误
我有一个使用 Asio 无升压版本的跨平台项目。在 OSX 上,我使用 autotools 构建库,然后将其包含在我的项目中:
我找不到适用于 Windows 的说明,并且在运行 CMake 时注意到 Asio 会生成一个 Visual Studio 文件,因此我将上面的说明设置为仅在 Unix 平台上运行。
但现在我在 Windows 上遇到奇怪的错误:
我也有一个实例asio::local::stream_protocol::endpoint
,我必须更改为asio::generic::stream_protocol::endpoint
.
所有这些代码都在 OSX 上编译并运行得非常好。
知道发生了什么吗?
c++ - Qt 事件处理程序和 boost ASIO 的 io_service 有什么区别?
两者都是带有事件循环的异步事件处理程序。这就是主线。
在 Qt 中,事件循环以 开头QApplication::exec()
,而 io_service 以 开头io_service::run()
。我的问题是在这一点之后。我可以在 Qt 而不是 io_service 中实现什么,反之亦然?有什么限制?什么时候更可取(忽略 Qt 的 GUI)?
更不重要的信息:在我脑海中引发这个问题的是我正在测试一些基于 C++ Qt 的程序,其中我的 GUI 逻辑位于从QObject
. 出于我的测试目的,我一直在寻找将函数(如在 io_service 中)发布到 Qt 事件处理程序的方法(因此,QObject::connect()
为简单起见绕过该事物),但随后意识到唯一的发布函数QApplication::postEvent();
,仅将 Qt 事件作为参数;不是函数、函子或 lambda!我没有问这个问题,因为这是一个明显的XY 问题,我仍在努力。
c# - ASIO 设备/驱动程序属性
在控制台应用程序中使用 NAudio & C#;以下代码列出了我的 PC 上安装的 ASIO 驱动程序:
代码片段:
CMD> 结果:
我想确定每个驱动程序的采样率和位深度支持,尽管位深度支持是此时最重要的方面。
此外,如果有任何方法可以知道当前连接的设备/驱动程序正在运行/处于活动状态,那将是惊人的。
编辑:
我应该指定我正在寻找连接/活动设备的音频流的传入位深度。
c++ - Boost::ASIO:如何从 io_service 捕获返回值?
如何从中捕获返回值boost::asio::io_service
?是否可以使用一些不涉及重写函数的绑定或任何简单的构造?
以下是一个最小的示例。我正在尝试捕获以下值的返回值GetSum()
:
为什么?因为我正在设计一个线程池,并且我正在考虑我的选项,以使用户能够获得他的函数的返回值,而不必手动将他的函数与另一个函数包装起来,该函数将为他捕获返回值.
我的解决方案:
但我仍然希望有一些更简单的绑定,或者其他东西。
c++ - 如何避免触发已经破坏的 boost::asio::deadline_timer
我boost::asio::deadline_timer
在一个 io_service 对象上使用多个。std::shared_ptr
的boost::asio::deadline_timer
存储在std::map<int, std::shared_ptr<debug_tim>> timers
带有索引的容器中。
在计时器处理程序中,我擦除了其他boost::asio::deadline_timer
. 但是,似乎已擦除的计时器woule 经常被成功错误代码触发。
有什么办法可以避免。我希望对应于已擦除的计时器处理程序boost::asio::deadline_timer
始终以Operation canceled
.
我错过了什么吗?
这是重现行为的代码
https://wandbox.org/permlink/G0qzYcqauxdqw4i7
boost::asio::deadline_timer::cancel()
在我删除计时器之前,我也会打电话。但是,我得到了类似的结果。这是取消版本:
https://wandbox.org/permlink/uM0yMFufkyn9ipdG
编辑
菲利克斯,谢谢你的回答。我理解这种boost::asio::deadline::timer::cancel()
行为。我总是需要关心的一生boost::asio::deadline::timer
。在我的项目的实际代码中,`boost::asio::deadline::timer` 是另一个对象(例如会话对象)的成员变量。在计时器处理程序中,它访问对象。这很危险。
我考虑如何编写安全代码。我想出了使用std::weak_ptr
来检查对象的生命周期。
这是更新的代码:
这是避免访问已删除对象的好方法boost::asio::deadline_timer
吗?
编辑
我的weak_ptr 解决方案效果很好。
c# - NAudio Asio 不支持的源流格式
我阅读了有关 NAudio 的所有内容,但在这里找不到解决方案。
该项目是一个 VS C# Windows 窗体。
使用 NAudio 和 ASIO4All 测试单声道和立体声 wav 文件是成功的,但尝试播放 8 ch。(44k/16bits) wav 文件总是给出“不支持的源流格式”错误。这是 NAudio 限制吗?任何想法?
8 通道。wav 文件经过测试可以在支持 Asio 的播放器中完美播放...