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

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

cpp 复制代码
#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++ 编译器,编译命令如下:

sh 复制代码
g++ -std=c++17 -o udp_client udp_client.cpp -lpthread

运行程序:

sh 复制代码
./udp_client

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

相关推荐
xrandzj20 分钟前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python
DLYSB_1 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
雨田言炎3 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
程序喵大人4 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
SomeB1oody4 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
ZhangShao06074 小时前
题解:CF2249B
c++·算法
用户昵称1005 小时前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言
吹什么轩6 小时前
c++复习:map和set的使用
开发语言·c++
2501_915918416 小时前
iOS 怎么抓包?抓包鹰系统级 网卡 应用层三种方式对比,不越狱抓 iPhone 流量
网络协议·计算机网络·网络安全·ios·adb·https·udp
必须得开心呀6 小时前
qt生成dump文件并定位异常
开发语言·qt