独立C++ asio库实现的UDP Client

news/2025/2/15 12:44:11/

以下是使用独立的 asio 库(无需依赖 Boost)实现的 UDP 客户端示例代码。该客户端可以向指定的 UDP 服务器发送消息,并接收服务器的响应。

#include <iostream>
#include <asio.hpp>
#include <asio/ip/udp.hpp>
#include <string>
#include <array>class UdpClient {
public:UdpClient(asio::io_context& io_context, const std::string& server_ip, const std::string& server_port): socket_(io_context), resolver_(io_context) {// 创建查询对象asio::ip::udp::resolver::query query(asio::ip::udp::v4(), server_ip, server_port);// 解析服务器地址和端口,获取端点信息auto endpoints = resolver_.resolve(query);// 选择第一个解析结果作为目标端点receiver_endpoint_ = *endpoints.begin();// 打开 UDP 套接字socket_.open(asio::ip::udp::v4());}void sendMessage(const std::string& message) {// 发送消息到服务器socket_.send_to(asio::buffer(message), receiver_endpoint_);}std::string receiveMessage() {std::array<char, 1024> buffer;asio::ip::udp::endpoint sender_endpoint;// 接收服务器的响应size_t length = socket_.receive_from(asio::buffer(buffer), sender_endpoint);return std::string(buffer.data(), length);}private:asio::ip::udp::socket socket_;asio::ip::udp::resolver resolver_;asio::ip::udp::endpoint receiver_endpoint_;
};int main() {try {asio::io_context io_context;// 创建 UDP 客户端,连接到本地 127.0.0.1 的 12345 端口UdpClient client(io_context, "127.0.0.1", "12345");// 要发送的消息std::string message = "Hello, UDP Server!";client.sendMessage(message);// 接收服务器的响应std::string response = client.receiveMessage();std::cout << "Received from server: " << response << std::endl;} catch (const std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;}return 0;
}

代码说明

UdpClient
  1. 构造函数
    • 接收 asio::io_context 对象、服务器 IP 地址和端口号作为参数。
    • 创建 asio::ip::udp::resolver::query 对象,用于解析服务器地址和端口。
    • 调用 resolver_.resolve(query) 进行解析,获取服务器端点信息。
    • 选择第一个解析结果作为目标端点 receiver_endpoint_
    • 打开 UDP 套接字。
  2. sendMessage 方法
    • 接收一个 std::string 类型的消息,将其转换为 asio::buffer 并发送到服务器端点。
  3. receiveMessage 方法
    • 创建一个 std::array 作为接收缓冲区。
    • 调用 socket_.receive_from 接收服务器的响应,并记录发送方的端点信息。
    • 将接收到的数据转换为 std::string 并返回。
main 函数
  • 创建 asio::io_context 对象。
  • 创建 UdpClient 实例,连接到本地 127.0.0.112345 端口。
  • 定义要发送的消息并调用 sendMessage 方法发送。
  • 调用 receiveMessage 方法接收服务器的响应并输出。
  • 使用 try-catch 块捕获并处理可能的异常。

编译和运行

假设使用 g++ 编译器,编译命令如下:

g++ -std=c++17 -o udp_client udp_client.cpp -lpthread

运行程序:

./udp_client

请确保有一个 UDP 服务器在 127.0.0.112345 端口监听,以便客户端能够正常通信。


http://www.ppmy.cn/news/1572240.html

相关文章

通达信如何导出以往的分时数据

1当天分时数据的导出 以梦网科技为例&#xff0c;在分笔交易上面右键&#xff0c;选择“放大”&#xff0c;放大后选择“选项”&#xff0c;选择“数据导出”&#xff0c;弹出界面中修改路径与文件名即可。 2以往数据的导出 以梦网科技为例&#xff0c;今天是2025年2月14号…

Cursor AI开发微信小程序教程

1. 准备工作 在开始开发之前&#xff0c;需要完成以下准备工作&#xff1a; 1.1 安装微信开发者工具 前往微信开发者工具官网下载并安装适合操作系统的开发者工具。注册微信小程序账号&#xff0c;登录微信公众平台&#xff08;https://mp.weixin.qq.com&#xff09;&#…

LeetCode刷题第7题【整数反转】---解题思路及源码注释

LeetCode刷题第7题【整数反转】—解题思路及源码注释 结果预览 目录 LeetCode刷题第7题【整数反转】---解题思路及源码注释结果预览一、题目描述二、解题思路1、问题理解2、解题思路 三、代码实现及注释1、源码实现2、代码解释 四、执行效果1、时间和空间复杂度分析 一、题目描…

win10右键使用IDEA打开

win10右键使用IDEA打开 问题修改注册表 问题 电脑重装系统之后&#xff0c; 在文件夹中右键缺失了使用IDEA打开项目的快捷操作&#xff0c; 这里记录一下怎么恢复。 修改注册表 使用winR打开运行&#xff0c;输入regedit点击确定&#xff0c;进入注册表。 找到路径计算机\HK…

C++-----------酒店客房管理系统

酒店客房管理系统 要求&#xff1a; 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订&#xff0c;系统会自动判断客房的可用情况; 4.入住管理:客户入住…

/etc/sysctl.conf——系统的配置文件

用户级修改 控制当前会话的文件描述符数量(一般打开一个终端就是一个会话) # 设置软限制&#xff08;当前会话中可使用的最大文件描述符数&#xff09; ulimit -Sn 65535 # 设置硬限制&#xff08;软限制的上限&#xff09; ulimit -Hn 65535控制核文件大小 ulimit -c unlim…

STL语言在工业自动化中的价值与应用场景分析

STL语言在工业自动化中的价值与应用场景分析 引言 作为西门子PLC编程的核心语言&#xff0c;STL&#xff08;Statement List&#xff09;凭借其底层控制能力&#xff0c;长期在工业自动化领域占据重要地位。然而&#xff0c;随着LAD、FBD、SCL等高级语言的普及&#xff0c;关…

算法跟练第十弹——栈与队列

文章目录 part01 逆波兰表达式求值part02 滑动窗口最大值part03 前 K 个高频元素归纳&#xff1a;将字符串转转换成整数&#xff1a;LinkedListMap遍历优先级队列的比较器 跟着代码随想录刷题的第十天。 代码随想录链接&#xff1a;代码随想录 part01 逆波兰表达式求值 题目链接…