问题标签 [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++ - 如何使用 clang++ 链接到 /usr/local 编译中的 boost?
我不是基于命令行的编译专家。我从boost 官方示例中开发了以下 asio UDP 应用程序。
我使用 Macports 安装了 boost 1.59,因为这是我正在做的版本sudo port install boost
。我看到提升位于我的/usr/local/lib
& 标题中/usr/local/include
我尝试了其他讨论的建议,但代码无法编译,因为它无法链接到 boost。我在 OSX 上并尝试使用以下命令使用 clang 进行编译
试过这个
但得到以下错误:
networking - UDP数据包字节读取粒度?
我有 UDP 客户端和服务器应用程序,以及基于 UDP 的自定义协议。
每个“协议包”都包含带有有效负载大小的标头,以及本身的有效负载。
每个“协议数据包”不超过 MTU 大小,预计不会出现碎片。
目前我正在使用 ASIO 库并遇到一些问题:
时间图:
客户端发送标头(2 字节)和有效负载(N < MTU-2 字节)------>
服务器仅读取 2 个字节,以确保有效负载大小。
服务器接收具有有效负载大小的标头
服务器尝试接收 N 字节的有效负载......但什么也没有。完成处理程序永远不会发生。
如果客户端再发送一个数据包(出于调试目的),服务器完成处理程序就会被触发——这就是为什么我认为我的 asio 异步循环没问题。
此外,如果服务器尝试每次读取读取整个传输 2+N 个字节,则接收到所有数据。
所以我有点困惑。通过顺序执行 _socket.async_receive_from() 可以顺序读取一个 UDP 数据报的单独字节。
很高兴得到帮助,在此先感谢。
windows - Raspberry Pi 3 上 Windows 10 IOT 上的 ASIO 驱动程序
我正在编写一个应用程序来处理旨在在 Windows 10 IOT 上运行的音频。由于性能原因,我想使用 ASIO 驱动程序。无法安装 Asio4all 驱动程序。是否(已经)有我不知道的 Windows 10 IOT Asio 驱动程序?
感谢帮助!
sockets - Boost ASIO 异步套接字超时
我正在尝试找到正确/规范的方法来实现下面的代码,该代码提供了围绕异步 asio 方法的同步包装器,以便超时。代码似乎可以工作,但我看过的示例都没有使用 lambda 中的布尔值来终止运行 i/o 服务的 do/while 循环,所以我不确定这是否是正确的形式,或者它是否会有意想不到的后果。有些人会做一些事情,比如 while(IOService.run_one); 但这永远不会终止。
编辑:我正在尝试遵循此示例: http: //www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/timeouts/blocking_tcp_client.cpp
但是在这段代码中,他们避免了需要使用 \n 终止符读取的字节数。我需要读取的字节数,因此需要回调。
我见过许多其他使用 boost 异步期货以及其他方法的解决方案,但它们似乎无法与 Ubuntu 16.04 的 gcc / boost 标准版本一起编译,我想继续使用这些版本。
c++ - 当服务停止并重新启动时,打开的 asio tcp 套接字会发生什么?
简短版本:如果我在 ioserive 中运行了一个打开的 tcp 套接字,如果我停止服务会发生什么?数据是否应该继续在 tcp 套接字中排队(假设服务器继续发送数据并且没有断开连接)?如果是这样,我可以通过重置并重新启动 ioserive 来检索该数据吗?
长版:我试图在我的基于 asio 的 tcp 套接字 API 周围放置一个阻塞接口。
用户最初使用打开到服务器的套接字的 API 进行连接。
对于每个后续的 API 调用,ioservice 都会重置并启动,然后使用带有 boost::asio::write 的 tcp 套接字将数据发送到服务器,并等待响应。来自服务器的响应使用 async_read_until 处理。当收到响应时,处理程序被调用,ioservice 停止并且原始阻塞 API 调用释放回客户端,并带有来自服务器的数据。这适用于请求-响应类型的命令。总之:
- API 阻塞调用
- ioservice 重置并启动
- tcp 数据包发送到服务器
- 服务器响应
- 处理程序调用
- ioservice 已停止
- 释放 API 调用并将数据传递给用户
另一个命令是请求-响应,它从服务器开始广播,更新客户端的内部缓存。这个想法是用户在初始尝试使用类似于上面的 ioservice 启动-停止过程刷新它之后,使用另一个 API 函数访问这个缓存。但是,在此尝试之前,代码会使用以下选项之一检查套接字上是否有任何数据可用:
永远不会有任何数据,即使服务器已记录为已发送数据。
所以广播的总结:
- 成功执行上一个要点列表开始广播
- 观察服务器已经发送数据
- 调用上面的代码块,查看socket中是否有数据(注意此时服务还没有启动)
- 从来没有任何数据
c++ - 在前一个完成之前再次调用 boost ASIO async_receive()
我知道同一套接字对象的方法的并发调用会导致未定义的行为。
但是在调用第一个完成处理程序之前调用异步操作并再次(非同时)调用它呢?
说,以下(如果有的话)的预期行为是什么:
?
这似乎是某人不应该做的事情,但我在文档中找不到解决此类问题的任何特定位置。
c++ - 带有 boost async_read_some 的“字符串迭代器不可取消引用”
我有一个服务器,它使用来自 boost 的异步套接字和一个“接受”函数,如下所示(在这个例子中,“用户”几乎等同于“会话” ):
一个“读取”函数如下(_readData
是一个 1024 的 char 数组):
还有一个“写”功能。
当我将客户端连接到服务器时,从客户端到服务器的第一次传输顺利进行,服务器按预期发回响应。然后,我一步步往代码里走,read函数完成后,代码进入了几个我不认识的头文件,最终抛出“表达式:无法取消引用字符串迭代器,因为迭代器失效(例如发生了重新分配) , 或字符串被破坏)”xstring
文件中的断言问题。对于我的一生,我不知道为什么。
编辑 1:buildReceivedMessage
创建 a ReceivedMessage
,其中以易于访问的格式包含请求的值,然后将其转发到 a messageHandler
,后者根据其类型转发请求。例如,第一个请求是一个登录请求,所以ReceivedMessage
在这个函数中结束:
c++ - 如何使用 boost asio 进行 IP 地址操作(屏蔽、or'ing 等)?
我有一个应用程序要安装到多个环境中,每个环境都具有相同的相对IP 地址。
举例来说,假设有三个设备(它比这要复杂得多,但为了简单起见,我已经将其缩减了)。设备和环境到IP地址的映射如下:
在这种情况下,每个设备都会有一个 IP“或地址”,0.0.0.0
包括0.0.1.255
(最右边的九位)。
因此,每个环境的基线 IP 是最左边的23 位(很像在路由表中找到的),而每个设备 IP 地址可以通过将其或地址与基线 IP 进行 ORing 来获得)。
因此,任何给定设备都可以通过这种方式计算其环境中所有其他设备的 IP 地址(它从自己的 IP 地址获取基线)。无需在环境之间进行通信。
所以我有几件事情需要做(强烈偏爱使用 Boost,因为我希望它可以跨多个平台移植)。
1/ 我需要能够获取当前设备的本地 IP 地址,记住只有一个地址,所以不必担心多 NIC 或多宿主。
2/ 我需要能够将最右边的 N 位清零,然后将该值与另一个地址进行或运算。
完成这些任务最简单的方法是什么?完成后,获取字符串表示(或直接使用最终地址)应该很容易。
boost - 如何使用 boost.asio 在客户端和服务器之间来回交换数据?
我实现了两个简单的客户端和服务器示例,但它不起作用。客户端和服务器都只是冻结而没有打印任何消息。
客户端.cpp
服务器.cpp
另外我想知道向/从套接字传输大量数据的最佳方法,我们如何告诉套接字我已经完成向套接字写入数据?我们怎么知道我们已经从套接字读取了最后一个字节的数据?谢谢。
c++ - c++ 服务器设计 boost asio
我对我当前的游戏服务器设计持怀疑态度,并正在寻求实际指导。我目前正在预分配固定数量的客户端,它们在类中具有自己的接收缓冲区,已预分配。一切都好,直到我遇到处理数据包的点,我需要回复。我当前的设计是预先分配固定数量的发送缓冲区,并以无锁的方式从空闲列表中取出一个,并在发送数据包后将其放回。我想知道正确的方法是使用无锁空闲缓冲区列表,还是每次发送新数据包时都需要调用 new/delete。
目前的方式: