即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序

2024-01-06

我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容:

class UDPClient
{
public:
    udp::socket* socket;
    udp::endpoint* receiver_endpoint;
    boost::array<char, 1024> recv_buffer;

    UDPClient();
    void do_receive();
    void handle_receive(const boost::system::error_code& error, size_t);
};

UDPClient::UDPClient()
{
    boost::asio::io_service io_service;

    udp::resolver resolver(io_service);
    udp::resolver::query query(udp::v4(), "127.0.0.1", "8888");
    receiver_endpoint = new udp::endpoint(*resolver.resolve(query));

    socket = new udp::socket(io_service);
    socket->open(udp::v4());

    do_receive();

    while (true)
    {
        io_service.poll();
        Sleep(1);
    }
}

void UDPClient::do_receive()
{
    socket->async_receive_from(boost::asio::buffer(recv_buffer), *receiver_endpoint,
                               boost::bind(&UDPClient::handle_receive, this,
                               boost::asio::placeholders::error,
                               boost::asio::placeholders::bytes_transferred));
}

void UDPClient::handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
    cout << "ulala" << endl;

    if (!error || error == boost::asio::error::message_size)
        do_receive();
}

如果一切按计划进行,则仅当有传入消息时才会打印“ulala”。然而,这里的情况并非如此...处理程序会立即被调用,并且无论是否有传入消息,都会打印“ulala”。我尝试了一些不同的方法:将 io_service.poll() 与 io_service.run() 和 io_service.run_one() 交换,以及删除 Sleep(1),但这些更改都对问题没有任何影响。我应该怎么办?

提前致谢!


socket = new udp::socket(io_service);
socket->open(udp::v4());

设置一个用于发送到任意端点的套接字。要接收(“听”),请使用

socket = new udp::socket(io_service, udp::endpoint(udp::v4(), 8888));

除此之外,套接字和接收端点现在已经泄漏。要解决这个问题:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <iostream>

using boost::asio::ip::udp;

class UDPClient
{
public:
    boost::asio::io_service io_service;
    udp::socket socket;
    udp::endpoint receiver_endpoint;
    boost::array<char, 1024> recv_buffer;

    UDPClient();
    void do_receive();
    void handle_receive(const boost::system::error_code& error, size_t);
};

UDPClient::UDPClient()
    : io_service(),
      socket(io_service, {udp::v4(), 8888})
{
    do_receive();
    io_service.run();
}

void UDPClient::do_receive()
{
    socket.async_receive_from(boost::asio::buffer(recv_buffer), receiver_endpoint,
                               boost::bind(&UDPClient::handle_receive, this,
                               boost::asio::placeholders::error,
                               boost::asio::placeholders::bytes_transferred));
}

void UDPClient::handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
    std::cout << "ulala" << std::endl;
    std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";

    if (!error || error == boost::asio::error::message_size)
        do_receive();
}

int main()
{
    UDPClient updclient;
}

这还会打印收到的消息(假设它是可打印的)。看

  • boost::asio async_receive_from UDP端点在线程之间共享? https://stackoverflow.com/questions/26703583/boostasio-async-receive-from-udp-endpoint-shared-between-threads/26705453#26705453

一种可以同时处理多个 UDP 请求的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序 的相关文章

随机推荐

  • PostgreSQL 上不存在 Doctrine 列 id

    我被迫使用PostgreSQL 我已经读过一些相关内容 但它仍然是新的 我不知道为什么会收到此错误 SQLSTATE 42703 Undefined column 7 ERROR column t0 id does not exist LI
  • 线程或服务

    我对 Android 上的线程和服务感到困惑 如果我必须从服务器下载一些文件 一次可能有多个文件 在这种情况下我应该选择什么 线程还是服务 在这种情况下我应该选择什么线程或服务 这不是一个 或 这是一个 和 您使用后台线程and一项服务 从
  • 以编程方式创建可同步的 Android 日历

    我开发了一个应用程序功能 可以通过应用程序创建和同步本地电话日历 现在我必须在线同步此日历 最好通过本机电话帐户 我尝试通过帐户名称和类型扩展 URI 的内容值参数 请参阅下面的 API LVL id sync account sync a
  • gnuplot 中的历史记录自动完成

    在 gnuplot 中 我输入 gnuplot gt set style data lines 然后我运行其他几行 gnuplot gt plot data traj1 dat u 1 4 u 1 6 u 1 9 u 1 11 u 1 13
  • 当我将其构建为 Android 应用程序包时,为什么我的 Android 应用程序无法运行?

    我想开始将我的应用程序发布为 AAB 我成功构建了我的构建 aab文件并决定尝试在我的手机上安装应用程序 我用下一个方法 1 使用命令从 aab 文件构建 APK 集 java jar bundletool jar build apks b
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • Android 库项目自定义构建

    我有一个遗留应用程序 需要将其拆分为一个库项目 通用代码 和两个应用程序项目 付费和免费应用程序 我不使用 Eclipse 进行开发 也不使用 Android SDK 提供 生成 的 Ant 构建 有几个原因 不同的项目目录结构 集成到构建
  • 使用java从jar作为资源播放.wav文件

    我想使用 jar 文件中的 java 代码作为资源来播放 wav 文件 我的代码是这样的 try URL defaultSound getClass getResource images ads WindowsNavigationStart
  • 如何获取HTTP 404响应的响应内容

    有没有比直接通过 tcp 访问主机更简单的方法来获取 HTTP 404 响应的内容 这是 404 响应的示例 内容如下 HTTP 1 1 404 Object Not Found Server CouchDB 1 3 0 Erlang OT
  • 连接分层模块:SystemVerilog 中的结构与接口

    在 SystemVerilog 中 分层模块可以通过简单数据类型 复杂数据类型 结构 联合等 或接口进行连接 我感兴趣的功能是将两个模块之间的所有信号聚合到一个地方 这简化了代码的维护 例如 在下面的例子中 更改 s point 的定义而不
  • 是否将指针移动到结构成员 UB 的后面?并访问它?

    看看这个片段 struct S float x y z void fn S s 0 0 0 float p s x p 2 1 if constexpr sizeof S sizeof float 3 if S has no padding
  • 复制链表中的结构

    在这里 我将结构从一个节点复制到另一个节点 但是当我遇到最后一个节点时 我将出现分段错误 因为temp clsf gt next in memcpy将指向无效位置 我该如何解决这个问题 我无法自由temp clsf因为它不是动态分配 whi
  • C# 使用递归从 List 创建 HTML 无序列表

    是否可以使用递归输出以下 HTML 无序列表 ul li 1 ul li 5 ul li 8 li li 9 li ul li li 6 li ul li li 2 li li 3 li li 4 li li 7 li ul 原始数据保存在
  • 如何按特定顺序获得电源组?

    有一些计算幂集的解决方案 但我在谷歌上找到的这些解决方案并没有按我需要的顺序给出幂集 例如 如果我想要的幂集 1 2 3 4 常见算法为我提供了一个幂集 以下顺序 1 2 1 2 3 1 3 2 3 1 2 3 4 1 4 2 4 1 2
  • Python PyInstaller 和包含图标文件

    我正在使用 PyInstaller v1 5 构建一个可执行文件 另外 我正在使用 GUI2EXE 来帮助我 我的脚本需要位于工作目录中的图标文件 icon file pics myicon ico 当我构建可执行文件时 我希望不必包含 工
  • 读取 XML 属性并获取其值

    我对这个 XML 问题很感兴趣 我有一个 XML 文件 我可以浏览该文件来查找值 一切工作正常 我可以阅读所有子节点 但我被困在这一部分 包含照片的XML部分都是相同的节点名称 除了一个属性之外 我如何指定如何根据此浏览并获取每个文件的文件
  • OpenCart 2.0:如何从结账页面删除账单详细信息

    基本上 我想从 OpenCart 2 0 的结账页面中删除 步骤 2 账单详细信息 我的网站仅接受银行存款 货到付款和商店提货作为付款方式 因此我不需要第 2 步 我该如何操作 我看过很多操作方法 但没有看到 OpenCart 2 0 的操
  • gradle > 任务:app:externalNativeBuildDebug FAILED android_gradle_build.json(没有这样的文件或目录)

    我正在尝试使用命令行从命令行构建一个android项目 gradlew app assembleDebug 但是 当我构建任务失败时 gt Task app externalNativeBuildDebug FAILED FAILURE B
  • 防止多行文本框“窃取”滚动事件

    我在 TabControl 中有一些多行文本框 选项卡控件有一个滚动条 但一旦多行文本框聚焦 滚动将滚动文本框而不是选项卡控件 有什么方法可以阻止文本框接受事件并更像普通文本框 但仍然是多行的 将 TextBox ScrollBars 属性
  • 即使没有传入消息,Boost ASIO UDP 客户端 async_receive_from 也会调用处理程序

    我已将 Boost 白天客户端教程中的 UDP 客户端代码修改为以下内容 class UDPClient public udp socket socket udp endpoint receiver endpoint boost array