问题标签 [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 回答
1466 浏览

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 进行编译

试过这个

但得到以下错误:

0 投票
1 回答
259 浏览

networking - UDP数据包字节读取粒度?

我有 UDP 客户端和服务器应用程序,以及基于 UDP 的自定义协议。

每个“协议包”都包含带有有效负载大小的标头,以及本身的有效负载。

每个“协议数据包”不超过 MTU 大小,预计不会出现碎片。

目前我正在使用 ASIO 库并遇到一些问题:

时间图:

  1. 客户端发送标头(2 字节)和有效负载(N < MTU-2 字节)------>

  2. 服务器仅读取 2 个字节,以确保有效负载大小。

  3. 服务器接收具有有效负载大小的标头

  4. 服务器尝试接收 N 字节的有效负载......但什么也没有。完成处理程序永远不会发生。

如果客户端再发送一个数据包(出于调试目的),服务器完成处理程序就会被触发——这就是为什么我认为我的 asio 异步循环没问题。

此外,如果服务器尝试每次读取读取整个传输 2+N 个字节,则接收到所有数据。

所以我有点困惑。通过顺序执行 _socket.async_receive_from() 可以顺序读取一个 UDP 数据报的单独字节。

很高兴得到帮助,在此先感谢。

0 投票
0 回答
783 浏览

windows - Raspberry Pi 3 上 Windows 10 IOT 上的 ASIO 驱动程序

我正在编写一个应用程序来处理旨在在 Windows 10 IOT 上运行的音频。由于性能原因,我想使用 ASIO 驱动程序。无法安装 Asio4all 驱动程序。是否(已经)有我不知道的 Windows 10 IOT Asio 驱动程序?

感谢帮助!

0 投票
2 回答
1463 浏览

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 标准版本一起编译,我想继续使用这些版本。

0 投票
0 回答
76 浏览

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中是否有数据(注意此时服务还没有启动)
  • 从来没有任何数据
0 投票
1 回答
412 浏览

c++ - 在前一个完成之前再次调用 boost ASIO async_receive()

我知道同一套接字对象的方法的并发调用会导致未定义的行为。

但是在调用第一个完成处理程序之前调用异步操作并再次(非同时)调用它呢?

说,以下(如果有的话)的预期行为是什么:

?

这似乎是某人不应该做的事情,但我在文档中找不到解决此类问题的任何特定位置。

0 投票
2 回答
900 浏览

c++ - 带有 boost async_read_some 的“字符串迭代器不可取消引用”

我有一个服务器,它使用来自 boost 的异步套接字和一个“接受”函数,如下所示(在这个例子中,“用户”几乎等同于“会话” ):

一个“读取”函数如下(_readData是一个 1024 的 char 数组):

还有一个“写”功能。

当我将客户端连接到服务器时,从客户端到服务器的第一次传输顺利进行,服务器按预期发回响应。然后,我一步步往代码里走,read函数完成后,代码进入了几个我不认识的头文件,最终抛出“表达式:无法取消引用字符串迭代器,因为迭代器失效(例如发生了重新分配) , 或字符串被破坏)”xstring文件中的断言问题。对于我的一生,我不知道为什么。

编辑 1:buildReceivedMessage创建 a ReceivedMessage,其中以易于访问的格式包含请求的值,然后将其转发到 a messageHandler,后者根据其类型转发请求。例如,第一个请求是一个登录请求,所以ReceivedMessage在这个函数中结束:

0 投票
1 回答
257 浏览

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 位清零,然后将该值与另一个地址进行或运算。

完成这些任务最简单的方法是什么?完成后,获取字符串表示(或直接使用最终地址)应该很容易。

0 投票
1 回答
570 浏览

boost - 如何使用 boost.asio 在客户端和服务器之间来回交换数据?

我实现了两个简单的客户端和服务器示例,但它不起作用。客户端和服务器都只是冻结而没有打印任何消息。

客户端.cpp

服务器.cpp

另外我想知道向/从套接字传输大量数据的最佳方法,我们如何告诉套接字我已经完成向套接字写入数据?我们怎么知道我们已经从套接字读取了最后一个字节的数据?谢谢。

0 投票
0 回答
96 浏览

c++ - c++ 服务器设计 boost asio

我对我当前的游戏服务器设计持怀疑态度,并正在寻求实际指导。我目前正在预分配固定数量的客户端,它们在类中具有自己的接收缓冲区,已预分配。一切都好,直到我遇到处理数据包的点,我需要回复。我当前的设计是预先分配固定数量的发送缓冲区,并以无锁的方式从空闲列表中取出一个,并在发送数据包后将其放回。我想知道正确的方法是使用无锁空闲缓冲区列表,还是每次发送新数据包时都需要调用 new/delete。

目前的方式: