当前位置: 首页 > article >正文

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

以下是一个使用独立的 C++ Asio 库实现的 UDP 服务器的示例代码。这个 UDP 服务器可以监听指定端口,接收客户端发送的数据,并将接收到的数据原样返回给客户端。

#include <iostream>
#include <asio.hpp>
#include <array>

class UdpServer {
public:
    // 构造函数,初始化服务器并开始接收数据
    UdpServer(asio::io_context& io_context, short port)
        : socket_(io_context, asio::ip::udp::endpoint(asio::ip::udp::v4(), port)) {
        startReceive();
    }

private:
    // 开始异步接收数据的方法
    void startReceive() {
        socket_.async_receive_from(
            asio::buffer(data_, max_length), sender_endpoint_,
            [this](const asio::error_code& ec, std::size_t bytes_recvd) {
                if (!ec && bytes_recvd > 0) {
                    handleReceive(bytes_recvd);
                } else {
                    startReceive();
                }
            });
    }

    // 处理接收到的数据的方法
    void handleReceive(std::size_t length) {
        std::cout << "Received " << length << " bytes from "
                  << sender_endpoint_.address().to_string() << ":"
                  << sender_endpoint_.port() << std::endl;
        std::cout << "Message: " << std::string(data_.data(), length) << std::endl;

        // 回显接收到的数据给客户端
        socket_.async_send_to(
            asio::buffer(data_, length), sender_endpoint_,
            [this](const asio::error_code& /*ec*/, std::size_t /*bytes_sent*/) {
                startReceive();
            });
    }

    asio::ip::udp::socket socket_;
    asio::ip::udp::endpoint sender_endpoint_;
    static constexpr std::size_t max_length = 1024;
    std::array<char, max_length> data_;
};

int main() {
    try {
        // 创建 io_context 对象,用于管理异步操作
        asio::io_context io_context;
        // 创建 UDP 服务器实例,监听端口 12345
        UdpServer server(io_context, 12345);
        // 启动事件循环,处理异步操作
        io_context.run();
    } catch (const std::exception& e) {
        // 捕获并输出异常信息
        std::cerr << "Exception: " << e.what() << std::endl;
    }

    return 0;
}

代码解释

UdpServer
  1. 构造函数

    • 接收一个 asio::io_context 对象和一个端口号作为参数。
    • 创建一个 asio::ip::udp::socket 对象,并将其绑定到指定的端口(使用 asio::ip::udp::endpoint)。
    • 调用 startReceive 方法开始异步接收数据。
  2. startReceive 方法

    • 使用 socket_.async_receive_from 异步地从客户端接收数据。该方法接受一个缓冲区(asio::buffer)、一个存储发送方端点信息的 sender_endpoint_ 对象,以及一个回调函数。
    • 当有数据到达时,回调函数会被触发。如果没有错误且接收到的数据长度大于 0,则调用 handleReceive 方法处理数据;否则,继续等待下一次接收。
  3. handleReceive 方法

    • 打印接收到的数据的长度、发送方的 IP 地址和端口号。
    • 使用 socket_.async_send_to 异步地将接收到的数据原样返回给客户端。
    • 在发送完成的回调函数中,如果没有错误,继续调用 startReceive 方法等待下一次接收;如果有错误,则输出错误信息并继续等待。
main 函数
  1. 创建一个 asio::io_context 对象,它是 Asio 库的核心,用于管理异步操作的事件循环。
  2. 创建一个 UdpServer 对象,指定监听的端口为 12345
  3. 调用 io_context.run() 启动事件循环,开始处理异步操作。
  4. 使用 try-catch 块捕获并处理可能抛出的异常。

编译和运行

要编译这个程序,你可以使用以下命令(假设使用 g++ 编译器):

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

运行程序:

./udp_server

运行服务器后,它会开始监听 12345 端口,等待客户端发送数据。你可以使用网络调试工具或者编写一个 UDP 客户端程序来与这个服务器进行通信测试。


http://www.kler.cn/a/545485.html

相关文章:

  • 用python写一个聊天室程序
  • 使用Cocos Creator制作“打砖块”小游戏:从零开始的详细教程
  • 告别硬编码:用 load_dotenv 高效管理你的环境变量
  • 【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息
  • Trend Micro 网络安全●解决方案
  • 物联网平台-分布式的设备接入与管理系统
  • NGINX相关的知识点
  • 10. Hbase Compaction命令
  • 34.Qt使用回调函数
  • 财务主题数据分析-企业盈利能力分析
  • 人工智能时代下ai智能语音机器人如何以假乱真?
  • Oracle DBA 诊断及统计工具-1
  • Navicat导入海量Excel数据到数据库(简易介绍)
  • 前端IndexedDB使用教程
  • AI成为基础设施有哪些研究方向:模型的性能、可解释性,算法偏见
  • 数据操作与事务:确保数据一致性的关键
  • 接口自动化框架篇:框架中的数据流转处理!
  • Mac 下使用多版本 Node
  • [RabbitMQ] RabbitMQ常见面试题
  • AI代理软件行业白皮书