最新资讯

  • 引入日志系统设计:基于UDP协议的 回声系统 服务器-客户端通信实现

引入日志系统设计:基于UDP协议的 回声系统 服务器-客户端通信实现

2026-01-31 18:00:24 栏目:最新资讯 3 阅读

目录

一、UdpServer.hpp

1、代码详细讲解:UDP服务器实现

1. 头文件和预处理指令

2. 包含的头文件

3. 类型别名和常量定义

4. UdpServer类定义

4.1 构造函数

4.2 初始化方法 Init()

4.3 启动方法 Start()

4.4 析构函数

4.5 成员变量

5. 代码特点分析

6. 潜在改进点

7. 总结

2、知识点整理

1. 网络编程基础

2. 套接字编程关键函数

3. 地址结构与转换

4. 特殊地址与端口

5. 错误处理与日志

6. 面向对象设计

7. 资源管理

8. 网络数据格式

9. 多线程与扩展性

10. 安全考虑

二、UdpServer.cc

1、头文件引入

2、默认消息处理函数

3、主函数

3.1 参数检查

3.2 解析端口号

3.3 日志配置

3.4 创建UDP服务器

3.5 初始化和启动服务器

4、程序流程总结

5、关键设计点

6、可能的改进

三、UdpClient.cc

1、UDP客户端代码详细讲解

1. 头文件引入

2. 主函数

2.1 参数检查

2.2 解析参数

3. 创建套接字

4. 关于客户端绑定的说明

5. 设置服务器地址

6. 主循环

6.1 获取用户输入

6.2 发送消息

6.3 接收响应

7. 程序特点

8. 可能的改进

9. UDP客户端工作流程总结

2、关键知识点整理

1. UDP协议特点

2. 套接字编程基础

套接字创建

地址结构

3. 关键函数说明

sendto() - 发送数据

recvfrom() - 接收数据

4. 字节序转换

5. IP地址转换

6. 客户端绑定问题

7. 错误处理

代码执行流程

改进建议

重点注意

总结

四、相关必需头文件

Log.hpp

Mutex.hpp

五、运行输出示例


一、UdpServer.hpp

#pragma once

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "Log.hpp"

using namespace LogModule;

// 定义处理函数的类型别名:接收string参数,返回string结果
using func_t = std::function;

// 默认文件描述符值,表示未初始化
const int defaultfd = -1;

// UDP服务器类,用于网络通信
class UdpServer
{
public:
    // 构造函数
    // @param port: 服务器监听的端口号
    // @param func: 数据处理回调函数
    UdpServer(uint16_t port, func_t func)
        : _sockfd(defaultfd),
          _port(port),
          _isrunning(false),
          _func(func)
    {
    }

    // 初始化服务器,创建socket并绑定端口
    void Init()
    {
        // 1. 创建UDP套接字
        // AF_INET: IPv4地址族
        // SOCK_DGRAM: 数据报套接字(UDP)
        // 0: 让系统自动选择协议(对于UDP是IPPROTO_UDP)
        _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (_sockfd < 0)
        {
            LOG(LogLevel::FATAL) << "socket error!";
            exit(1);
        }
        LOG(LogLevel::INFO) << "socket success, sockfd : " << _sockfd;

        // 2. 绑定socket到指定端口
        struct sockaddr_in local;
        // 清零结构体,避免未初始化数据
        bzero(&local, sizeof(local));
        
        // 设置地址族为IPv4
        local.sin_family = AF_INET;
        
        // 将端口号从主机字节序转换为网络字节序(大端)
        local.sin_port = htons(_port);
        
        // INADDR_ANY表示绑定到所有本地接口
        // 服务器通常这样设置以接收所有网络接口的数据
        local.sin_addr.s_addr = INADDR_ANY;

        // 绑定socket到指定的地址和端口
        // 对于服务器必须显式绑定,因为需要固定监听端口
        int n = bind(_sockfd, (struct sockaddr *)&local, sizeof(local));
        if (n < 0)
        {
            LOG(LogLevel::FATAL) << "bind error";
            exit(2);
        }
        LOG(LogLevel::INFO) << "bind success, sockfd : " << _sockfd;
    }

    // 启动服务器,进入主事件循环
    void Start()
    {
        _isrunning = true;
        while (_isrunning)
        {
            char buffer[1024]; // 接收缓冲区
            struct sockaddr_in peer; // 存储对端地址信息
            socklen_t len = sizeof(peer); // 地址结构体长度

            // 1. 接收客户端消息
            // recvfrom是阻塞调用,直到收到数据或出错
            ssize_t s = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, 
                                (struct sockaddr *)&peer, &len);
            if (s > 0)
            {
                // 处理接收到的数据
                buffer[s] = ''; // 确保字符串正确终止
                
                // 获取客户端信息
                int peer_port = ntohs(peer.sin_port); // 网络字节序转主机字节序
                std::string peer_ip = inet_ntoa(peer.sin_addr); // 网络字节序IP转点分十进制

                // 调用回调函数处理数据
                std::string result = _func(buffer);

                // 2. 发送响应消息回客户端
                sendto(_sockfd, result.c_str(), result.size(), 0, 
                      (struct sockaddr*)&peer, len);
            }
        }
    }

    // 析构函数
    ~UdpServer()
    {
        // 注意:实际应该在这里关闭socket,但代码中遗漏了
        // 应该在_sockfd != defaultfd时调用close(_sockfd)
    }

private:
    int _sockfd;          // 服务器socket文件描述符
    uint16_t _port;       // 服务器监听端口
    bool _isrunning;      // 服务器运行状态标志
    func_t _func;         // 数据处理回调函数
};

1、代码详细讲解:UDP服务器实现

这段代码实现了一个基于UDP协议的服务器类UdpServer,下面我将从各个方面进行详细讲解。

1. 头文件和预处理指令

#pragma once
  • #pragma once 是一个非标准但被广泛支持的预处理指令,用于防止头文件被多次包含。

2. 包含的头文件

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "Log.hpp"
  • 标准库头文件:

  • 系统头文件:

    • : 提供bzero等字符串操作函数

    • : 定义数据类型

    • : 套接字API

    • : 互联网地址族定义

    • : IP地址转换函数

  • 自定义头文件:"Log.hpp"(日志模块)

3. 类型别名和常量定义

using func_t = std::function;
const int defaultfd = -1;
  • func_t: 定义了一个函数类型别名,表示接受一个const std::string&参数并返回std::string的函数

  • defaultfd: 定义了一个默认的文件描述符值(-1),用于初始化套接字

4. UdpServer类定义

4.1 构造函数
UdpServer(uint16_t port, func_t func)
    : _sockfd(defaultfd),
      _port(port),
      _isrunning(false),
      _func(func)
{
}
  • 参数:

    • port: 服务器监听的端口号

    • func: 处理接收数据的回调函数

  • 初始化列表:

    • _sockfd: 初始化为默认文件描述符(-1)

    • _port: 设置为传入的端口号

    • _isrunning: 初始化为false

    • _func: 设置为传入的回调函数

4.2 初始化方法 Init()
void Init()
{
    // 1. 创建套接字
    _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (_sockfd < 0)
    {
        LOG(LogLevel::FATAL) << "socket error!";
        exit(1);
    }
    LOG(LogLevel::INFO) << "socket success, sockfd : " << _sockfd;

    // 2. 绑定socket信息
    struct sockaddr_in local;
    bzero(&local, sizeof(local));
    local.sin_family = AF_INET;
    local.sin_port = htons(_port);
    local.sin_addr.s_addr = INADDR_ANY;

    int n = bind(_sockfd, (struct sockaddr *)&local, sizeof(local));
    if (n < 0)
    {
        LOG(LogLevel::FATAL) << "bind error";
        exit(2);
    }
    LOG(LogLevel::INFO) << "bind success, sockfd : " << _sockfd;
}
  1. 创建套接字:

    • 使用socket()函数创建UDP套接字(SOCK_DGRAM)

    • 失败时记录FATAL日志并退出程序

  2. 绑定地址信息:

    • 创建sockaddr_in结构体并清零

    • 设置地址族为AF_INET(IPv4)

    • 设置端口号(使用htons()将主机字节序转换为网络字节序)

    • 设置IP地址为INADDR_ANY(表示绑定到所有可用接口)

    • 调用bind()绑定套接字到指定地址和端口

    • 失败时记录FATAL日志并退出程序

4.3 启动方法 Start()
void Start()
{
    _isrunning = true;
    while (_isrunning)
    {
        char buffer[1024];
        struct sockaddr_in peer;
        socklen_t len = sizeof(peer);
        
        // 1. 接收消息
        ssize_t s = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, 
                            (struct sockaddr *)&peer, &len);
        if (s > 0)
        {
            // 处理对端信息
            int peer_port = ntohs(peer.sin_port);
            std::string peer_ip = inet_ntoa(peer.sin_addr);
            
            buffer[s] = 0; // 确保字符串以null结尾
            
            // 调用回调函数处理数据
            std::string result = _func(buffer);
            
            // 2. 发送响应
            sendto(_sockfd, result.c_str(), result.size(), 0, 
                  (struct sockaddr*)&peer, len);
        }
    }
}
  1. 主循环:

    • 设置_isrunning为true,进入循环

    • 循环会一直运行直到_isrunning变为false

  2. 接收数据:

    • 准备缓冲区buffer和存储对端地址的sockaddr_in结构体

    • 使用recvfrom()接收UDP数据报

    • 如果成功接收(s > 0):

      • 获取对端端口号(使用ntohs()转换字节序)

      • 获取对端IP地址(使用inet_ntoa()转换)

      • 确保缓冲区以null结尾

      • 调用回调函数_func处理接收到的数据

  3. 发送响应:

    • 使用sendto()将处理结果发送回对端

    • 使用之前接收到的对端地址信息

4.4 析构函数
~UdpServer()
{
}
  • 当前为空实现,理论上应该在这里关闭套接字和释放资源

4.5 成员变量
private:
    int _sockfd;          // 套接字文件描述符
    uint16_t _port;       // 服务器监听端口
    bool _isrunning;      // 服务器运行状态标志
    func_t _func;         // 数据处理回调函数

5. 代码特点分析

  1. UDP协议:使用SOCK_DGRAM类型的套接字、无连接协议,每次收发都需要指定对端地址

  2. 回调机制:通过func_t类型的回调函数处理接收到的数据、使服务器逻辑与通信逻辑分离,提高灵活性

  3. 日志记录:使用自定义的LogModule记录不同级别的日志、包括FATAL(致命错误)和INFO(信息性)日志

  4. 网络字节序转换:使用htons()/ntohs()处理端口号、使用inet_ntoa()处理IP地址

  5. 多接口支持:使用INADDR_ANY绑定到所有可用网络接口

6. 潜在改进点

  1. 资源释放:析构函数中应关闭套接字、考虑添加Stop()方法设置_isrunning为false

  2. 错误处理:可以添加更多错误处理逻辑、考虑非致命错误的恢复机制

  3. 性能优化:缓冲区大小固定为1024,可能不适合大块数据、可考虑动态缓冲区或分包处理

  4. 线程安全:当前实现不是线程安全的、如果需要在多线程环境中使用,需要添加同步机制

  5. IPv6支持:当前仅支持IPv4、可扩展支持IPv6

这个示例创建了一个监听8080端口的UDP服务器,对收到的每条消息都添加"Response to: "前缀后返回。

7. 总结

这段代码实现了一个基本的UDP服务器框架,具有以下特点:

  • 使用面向对象方式封装UDP服务器逻辑

  • 通过回调函数实现灵活的数据处理

  • 包含基本的错误处理和日志记录

  • 支持多网络接口

代码结构清晰,但还有一些可以改进的地方,如资源管理、错误处理和扩展性方面。

2、知识点整理

1. 网络编程基础

  • UDP协议特点:无连接、不可靠、面向数据报、传输效率高

  • 套接字类型

    • SOCK_DGRAM:数据报套接字(UDP)

    • SOCK_STREAM:流套接字(TCP)

  • 地址族

    • AF_INET:IPv4地址族

    • AF_INET6:IPv6地址族

2. 套接字编程关键函数

socket():创建套接字

int socket(int domain, int type, int protocol);

bind():绑定地址和端口

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

recvfrom():接收数据(UDP)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                struct sockaddr *src_addr, socklen_t *addrlen);

sendto():发送数据(UDP)

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);

3. 地址结构与转换

  • sockaddr_in结构体

    struct sockaddr_in {
        short            sin_family;   // 地址族(AF_INET)
        unsigned short   sin_port;     // 16位端口号(网络字节序)
        struct in_addr   sin_addr;     // 32位IPv4地址(网络字节序)
        char             sin_zero[8];  // 未使用(填充为零)
    };
  • 字节序转换

    • htons():主机字节序转网络字节序(16位)

    • ntohs():网络字节序转主机字节序(16位)

    • htonl()/ntohl():32位版本

  • IP地址转换

    • inet_addr():点分十进制字符串转网络字节序(已过时)

    • inet_aton():字符串转网络字节序(更安全)

    • inet_ntoa():网络字节序IP转点分十进制字符串

    • 现代替代方案:inet_pton()inet_ntop()

4. 特殊地址与端口

  • INADDR_ANY:绑定到所有本地接口(0.0.0.0)、服务器通常使用此方式监听所有网络接口

  • 端口号

    • 0:让系统自动分配临时端口

    • 1-1023:特权端口(需要root权限)

    • 1024-49151:用户注册端口

    • 49152-65535:动态/私有端口

5. 错误处理与日志

  • 代码中使用自定义日志模块(Log.hpp)记录不同级别日志

  • 系统调用失败时应检查返回值并适当处理

  • 严重错误(FATAL)导致程序退出

6. 面向对象设计

  • 使用类封装UDP服务器功能

  • 构造函数初始化关键参数

  • 提供Init()和Start()方法分离初始化和运行逻辑

  • 使用函数对象(std::function)实现灵活的数据处理回调

7. 资源管理

  • 代码中遗漏了socket的关闭操作

  • 最佳实践应在析构函数中关闭socket

  • 可考虑使用RAII模式管理资源

8. 网络数据格式

  • UDP是面向数据报的协议

  • 每次recvfrom()调用返回一个完整的数据报

  • 需要处理缓冲区溢出问题(示例中固定1024字节缓冲区)

9. 多线程与扩展性

  • 当前实现是单线程的,一次只能处理一个请求

  • 可扩展为多线程/多进程模型处理并发请求

  • 或使用I/O多路复用(select/poll/epoll)

10. 安全考虑

  • 未验证客户端身份,容易受到伪造源IP攻击

  • 未处理消息截断问题(缓冲区固定大小)

  • 生产环境需要添加更多安全措施

这个UDP服务器实现展示了基本的网络编程模式,但生产环境需要更多错误处理、性能优化和安全考虑。


二、UdpServer.cc

#include 
#include 
#include "UdpServer.hpp"

// 仅仅是用来进行测试的
std::string defaulthandler(const std::string &message)
{
    std::string hello = "hello, ";
    hello += message;
    return hello;
}

// 翻译系统,字符串当成英文单词


// ./udpserver port
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " port" << std::endl;
        return 1;
    }
    // std::string ip = argv[1];
    uint16_t port = std::stoi(argv[1]);

    Enable_Console_Log_Strategy();

    std::unique_ptr usvr = std::make_unique(port, defaulthandler);
    usvr->Init();
    usvr->Start();
    return 0;
}

这段代码实现了一个简单的UDP服务器,使用C++编写。下面我将从整体结构、各个部分的功能以及关键点进行详细讲解。

1、头文件引入

#include 
#include 
#include "UdpServer.hpp"
  • : 提供标准输入输出功能

  • : 提供智能指针支持(这里使用了std::unique_ptr

  • "UdpServer.hpp": 自定义的头文件,应该包含了UDP服务器的类定义

2、默认消息处理函数

std::string defaulthandler(const std::string &message)
{
    std::string hello = "hello, ";
    hello += message;
    return hello;
}

这是一个简单的消息处理函数,它:

  1. 接收一个字符串参数message

  2. 创建一个新的字符串"hello, "

  3. 将输入消息追加到这个字符串后面

  4. 返回组合后的字符串

这个函数将作为UDP服务器的默认消息处理器,当服务器收到消息时会调用它。

3、主函数

int main(int argc, char *argv[])
{
    // 参数检查
    if(argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " port" << std::endl;
        return 1;
    }
    
    // 解析端口号
    uint16_t port = std::stoi(argv[1]);

    // 启用控制台日志策略
    Enable_Console_Log_Strategy();

    // 创建UDP服务器实例
    std::unique_ptr usvr = std::make_unique(port, defaulthandler);
    
    // 初始化并启动服务器
    usvr->Init();
    usvr->Start();
    
    return 0;
}

3.1 参数检查

if(argc != 2)
{
    std::cerr << "Usage: " << argv[0] << " port" << std::endl;
    return 1;
}
  • 检查命令行参数数量是否正确

  • 如果不是2个参数(程序名+端口号),打印使用说明并返回错误码1

  • argv[0]是程序名,argv[1]应该是端口号

3.2 解析端口号

uint16_t port = std::stoi(argv[1]);
  • 将命令行参数(字符串)转换为无符号16位整数(端口号的标准类型)

  • 使用std::stoi进行转换

3.3 日志配置

Enable_Console_Log_Strategy();
  • 调用一个函数启用控制台日志策略

  • 从函数名可知,这是配置日志输出到控制台的函数

  • 具体实现在之前实现过的日志文件中(后面会加上展示)

3.4 创建UDP服务器

std::unique_ptr usvr = std::make_unique(port, defaulthandler);
  • 使用std::make_unique创建一个UdpServer的唯一指针

  • 构造函数参数:

    • port: 服务器监听的端口号

    • defaulthandler: 前面定义的消息处理函数

  • 使用智能指针可以自动管理内存,避免内存泄漏

        我们可能会遇到这样的错误,这个错误是因为 std::make_unique 是 C++14 引入的特性。解决方案:使用 C++14 或更高标准编译,也就是说在编译命令中添加 -std=c++14 或更高标准:

g++ -std=c++14 your_file.cpp -o your_program

3.5 初始化和启动服务器

usvr->Init();
usvr->Start();
  • Init(): 初始化服务器(可能包括创建socket、绑定端口等操作)

  • Start(): 启动服务器,开始监听和处理连接

  • 这两个方法的具体实现在UdpServer.hpp对应的源文件中

4、程序流程总结

  1. 检查命令行参数,确保提供了端口号

  2. 解析端口号

  3. 配置日志输出

  4. 创建UDP服务器实例,并指定消息处理函数

  5. 初始化服务器

  6. 启动服务器,进入事件循环

5、关键设计点

  1. 使用智能指针:通过std::unique_ptr管理UdpServer对象,确保异常安全性和自动内存管理。

  2. 可扩展的消息处理:通过将处理函数作为参数传递给UdpServer构造函数,实现了处理逻辑与网络层的解耦。可以轻松替换不同的处理函数。

  3. 简单的错误处理:目前只有基本的参数检查,实际的网络错误处理应该在UdpServer类的实现中。

  4. 日志策略:使用Enable_Console_Log_Strategy()函数,暗示了可能有多种日志输出方式,便于调试和生产环境切换。

6、可能的改进

  1. 添加更详细的错误处理,特别是网络相关的错误

  2. 允许通过配置文件或命令行参数指定不同的处理函数

  3. 添加信号处理,实现优雅关闭

  4. 增加日志级别控制

这段代码展示了一个基本的UDP服务器框架,核心功能依赖于UdpServer类的实现(未展示),但已经体现了良好的结构设计和资源管理实践。


三、UdpClient.cc

        这段代码实现了一个基于UDP协议的简单客户端程序,能够与指定的UDP服务器进行双向通信。程序通过命令行参数接收服务器IP地址和端口号,然后进入交互模式,用户可以输入消息发送给服务器并接收服务器的响应。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    // 1. 参数检查
    if (argc != 3) {
        std::cerr << "Usage: " << argv[0] << " server_ip server_port" << std::endl;
        return 1;
    }

    // 2. 解析服务器地址和端口
    std::string server_ip = argv[1];
    uint16_t server_port = std::stoi(argv[2]);

    // 3. 创建UDP套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        std::cerr << "socket error" << std::endl;
        return 2;
    }

    // 4. 配置服务器地址结构
    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(server_port);
    server.sin_addr.s_addr = inet_addr(server_ip.c_str());

    // 5. 主交互循环
    while (true) {
        // 获取用户输入
        std::string input;
        std::cout << "Please Enter# ";
        std::getline(std::cin, input);

        // 发送数据到服务器
        sendto(sockfd, input.c_str(), input.size(), 0, 
              (struct sockaddr*)&server, sizeof(server));

        // 接收服务器响应
        char buffer[1024];
        struct sockaddr_in peer;
        socklen_t len = sizeof(peer);
        int m = recvfrom(sockfd, buffer, sizeof(buffer)-1, 0, 
                        (struct sockaddr*)&peer, &len);
        
        // 处理接收到的数据
        if (m > 0) {
            buffer[m] = '';
            std::cout << "Server response: " << buffer << std::endl;
        }
    }

    // 程序不会执行到这里,因为前面是无限循环
    close(sockfd);
    return 0;
}

1、UDP客户端代码详细讲解

这段代码实现了一个简单的UDP客户端,可以与UDP服务器进行通信。下面我将从整体结构、各个部分的功能以及关键点进行详细讲解。

1. 头文件引入

#include 
#include 
#include 
#include 
#include 
#include 
#include 
  • : 提供标准输入输出功能

  • : 提供字符串处理功能

  • : 提供C风格字符串处理函数(如memset

  • : 定义IP地址和端口号等网络相关结构

  • : 提供IP地址转换函数(如inet_addr

  • : 提供套接字编程所需的各种类型和函数

2. 主函数

int main(int argc, char *argv[])
{
    // 参数检查
    if (argc != 3)
    {
        std::cerr << "Usage: " << argv[0] << " server_ip server_port" << std::endl;
        return 1;
    }
    
    // 解析服务器IP和端口
    std::string server_ip = argv[1];
    uint16_t server_port = std::stoi(argv[2]);
2.1 参数检查
  • 检查命令行参数数量是否正确

  • 如果不是3个参数(程序名+服务器IP+服务器端口),打印使用说明并返回错误码1

  • argv[0]是程序名,argv[1]是服务器IP,argv[2]是服务器端口

2.2 解析参数
  • server_ip: 存储服务器IP地址

  • server_port: 将字符串端口号转换为无符号16位整数

3. 创建套接字

// 1. 创建socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
    std::cerr << "socket error" << std::endl;
    return 2;
}
  • 使用socket()函数创建UDP套接字

    • AF_INET: 使用IPv4协议族

    • SOCK_DGRAM: 使用数据报套接字(UDP)

    • 0: 使用默认协议(对于UDP是IPPROTO_UDP)

  • 检查套接字是否创建成功,失败则打印错误并返回错误码2

4. 关于客户端绑定的说明

代码中的注释详细解释了UDP客户端是否需要绑定的问题:

本地IP和端口如何配置?需要与"文件"相关联吗? 关于客户端绑定问题:

  1. 必须绑定吗?是,需要绑定

  2. 需要显式绑定吗?不需要!首次发送消息时,操作系统会自动为客户端绑定。系统会自动获取IP,并使用随机端口号

  3. 原因:每个端口号只能被一个进程绑定,采用随机端口可以避免客户端端口冲突

  4. 注意:客户端端口号的具体数值不重要,只要保证唯一性即可

关键点:

  1. UDP客户端需要绑定,但通常不需要显式绑定

  2. 第一次发送数据时,操作系统会自动为客户端分配一个临时端口

  3. 这样做可以避免端口冲突,因为客户端端口号不重要

5. 设置服务器地址

// 填写服务器信息
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(server_port);
server.sin_addr.s_addr = inet_addr(server_ip.c_str());
  • 创建sockaddr_in结构体存储服务器地址信息

  • 使用memset初始化为0

  • 设置:

    • sin_family: 地址族(AF_INET表示IPv4)

    • sin_port: 端口号,使用htons()转换为网络字节序

    • sin_addr.s_addr: IP地址,使用inet_addr()将字符串IP转换为网络字节序

6. 主循环

while(true)
{
    // 获取用户输入
    std::string input;
    std::cout << "Please Enter# ";
    std::getline(std::cin, input);

    // 发送消息到服务器
    int n = sendto(sockfd, input.c_str(), input.size(), 0, 
                  (struct sockaddr*)&server, sizeof(server));
    (void)n; // 忽略返回值

    // 接收服务器响应
    char buffer[1024];
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);
    int m = recvfrom(sockfd, buffer, sizeof(buffer)-1, 0, 
                    (struct sockaddr*)&peer, &len);
    if(m > 0)
    {
        buffer[m] = 0; // 添加字符串结束符
        std::cout << buffer << std::endl;
    }
}
6.1 获取用户输入
  • 使用std::getline从标准输入读取一行文本

  • 提示用户输入"Please Enter# "

6.2 发送消息
  • 使用sendto()函数发送消息到服务器

    • sockfd: 套接字描述符

    • input.c_str(): 要发送的数据

    • input.size(): 数据长度

    • 0: 标志位,通常为0

    • (struct sockaddr*)&server: 服务器地址

    • sizeof(server): 地址长度

  • 忽略返回值(用(void)n避免编译器警告)

6.3 接收响应
  • 使用recvfrom()函数接收服务器响应

    • sockfd: 套接字描述符

    • buffer: 存储接收数据的缓冲区

    • sizeof(buffer)-1: 缓冲区大小(保留1字节给字符串结束符)

    • 0: 标志位,通常为0

    • (struct sockaddr*)&peer: 存储对端地址信息

    • &len: 输入输出参数,指定缓冲区大小并返回实际地址长度

  • 如果接收成功(m > 0):

    • 在数据末尾添加字符串结束符

    • 打印接收到的消息

7. 程序特点

  • 简单的交互式客户端:通过命令行与用户交互,每次输入都发送到服务器并等待响应

  • 无显式绑定:依赖操作系统自动分配临时端口

  • 基本的错误处理:只检查了套接字创建错误,其他错误被忽略

  • 固定缓冲区大小:使用1024字节的固定缓冲区接收数据

8. 可能的改进

  • 增强错误处理:检查sendtorecvfrom的返回值,处理各种错误情况

  • 动态缓冲区:根据接收数据大小动态分配缓冲区

  • 超时机制:为接收操作设置超时,避免无限等待

  • 多线程:分离发送和接收操作,提高响应性

  • 协议设计:定义更复杂的消息协议,而不仅仅是字符串交换

9. UDP客户端工作流程总结

  1. 解析命令行参数获取服务器地址和端口

  2. 创建UDP套接字

  3. 设置服务器地址结构

  4. 进入主循环:

    • 读取用户输入

    • 发送消息到服务器

    • 接收服务器响应并显示

  5. (理论上)当用户退出时关闭套接字(虽然这里没有显式关闭)

这段代码展示了一个基本的UDP客户端实现,适合用于学习UDP套接字编程的基础概念。

2、关键知识点整理

1. UDP协议特点

  • 无连接协议:不需要建立连接就可以直接发送数据

  • 不可靠传输:不保证数据包顺序和可靠性

  • 轻量级:相比TCP,头部开销小,传输效率高

  • 适合场景:实时性要求高、允许少量丢包的应用(如视频流、在线游戏)

2. 套接字编程基础

套接字创建
int socket(int domain, int type, int protocol);

  • domain:地址族

    • AF_INET:IPv4

    • AF_INET6:IPv6

  • type:套接字类型

    • SOCK_STREAM:TCP

    • SOCK_DGRAM:UDP

  • protocol:通常设为0,表示使用默认协议

地址结构
struct sockaddr_in {
    short            sin_family;   // 地址族 (AF_INET)
    unsigned short   sin_port;     // 16位端口号 (网络字节序)
    struct in_addr   sin_addr;     // 32位IP地址
    char             sin_zero[8];  // 未使用(填充使结构体大小等于sockaddr)
};

3. 关键函数说明

sendto() - 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);
  • sockfd:套接字描述符

  • buf:要发送的数据缓冲区

  • len:数据长度

  • flags:通常为0

  • dest_addr:目标地址

  • addrlen:地址结构长度

recvfrom() - 接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

  • sockfd:套接字描述符

  • buf:接收缓冲区

  • len:缓冲区大小

  • flags:通常为0

  • src_addr:返回发送方地址(可设为NULL如果不关心)

  • addrlen:输入输出参数,指定地址结构大小并返回实际大小

4. 字节序转换

  • 网络字节序:大端序(Big-Endian)

  • 主机字节序:取决于CPU架构(x86为小端序)

  • 关键函数:

    • htons():主机序转网络序(16位)

    • htonl():主机序转网络序(32位)

    • ntohs():网络序转主机序(16位)

    • ntohl():网络序转主机序(32位)

5. IP地址转换

  • inet_addr():将点分十进制字符串IP转换为网络字节序的32位值

  • inet_ntoa():将网络字节序的32位IP转换为点分十进制字符串

  • 更现代的替代函数:

    • inet_pton():支持IPv4和IPv6

    • inet_ntop():支持IPv4和IPv6

6. 客户端绑定问题

  • 是否需要显式绑定:通常不需要

  • 自动绑定机制

    • 第一次发送数据时,操作系统自动分配临时端口

    • 避免端口冲突(因为客户端端口不重要)

    • 使用随机高位端口(通常在32768-60999范围内)

7. 错误处理

  • 当前代码只检查了套接字创建错误

  • 实际开发中应检查:

    • sendto()返回值(实际发送的字节数)

    • recvfrom()返回值(接收的字节数或错误)

    • 使用perror()strerror(errno)获取错误信息

代码执行流程

  1. 参数检查:验证命令行参数数量是否正确

  2. 地址解析:将字符串形式的IP和端口转换为二进制格式

  3. 套接字创建:建立UDP套接字

  4. 地址配置:设置服务器地址结构

  5. 交互循环

    • 读取用户输入

    • 发送到服务器

    • 接收服务器响应

    • 显示响应内容

  6. (理论上)资源释放:关闭套接字(但当前代码因无限循环不会执行到这里)

改进建议

  1. 增加错误处理:检查所有系统调用的返回值

  2. 添加超时机制:使用select()poll()设置接收超时

  3. 支持信号处理:如Ctrl+C中断时优雅退出

  4. 动态缓冲区:根据数据大小动态分配缓冲区

  5. 日志记录:记录通信过程便于调试

  6. 多线程处理:分离发送和接收操作

重点注意

云服务器不支持直接绑定公有IP,我们也不建议在编写服务器程序时绑定特定IP地址,推荐使用INADDR_ANY来绑定任意地址。

/* 接受所有来源消息的地址 */
#define INADDR_ANY ((in_addr_t) 0x00000000)

        在网络编程中,当进程需要绑定网络端口进行通信时,可以使用INADDR_ANY作为IP地址参数。这种方式表示该端口可以接受来自任何IP地址的连接请求,无论是本地还是远程主机。例如,对于配备多网卡(每个网卡拥有不同IP地址)的服务器,使用INADDR_ANY可以免去识别数据具体来自哪个网卡/IP地址的麻烦。

总结

        这段代码展示了UDP客户端的基本实现,涵盖了套接字创建、地址配置、数据发送和接收等核心操作。通过学习这段代码,可以掌握UDP网络编程的基本模式和关键API的使用方法。理解UDP的无连接特性、字节序转换和地址处理是掌握网络编程的基础。


四、相关必需头文件

Log.hpp

#ifndef __LOG_HPP__
#define __LOG_HPP__

#include 
#include 
#include 
#include  //C++17
#include 
#include 
#include 
#include 
#include 
#include "Mutex.hpp"

namespace LogModule
{
    using namespace MutexModule;

    const std::string gsep = "
";
    // 策略模式,C++多态特性
    // 2. 刷新策略 a: 显示器打印 b:向指定的文件写入
    //  刷新策略基类
    class LogStrategy
    {
    public:
        ~LogStrategy() = default;
        virtual void SyncLog(const std::string &message) = 0;
    };

    // 显示器打印日志的策略 : 子类
    class ConsoleLogStrategy : public LogStrategy
    {
    public:
        ConsoleLogStrategy()
        {
        }
        void SyncLog(const std::string &message) override
        {
            LockGuard lockguard(_mutex);
            std::cout << message << gsep;
        }
        ~ConsoleLogStrategy()
        {
        }

    private:
        Mutex _mutex;
    };

    // 文件打印日志的策略 : 子类
    const std::string defaultpath = "./log";
    const std::string defaultfile = "my.log";
    class FileLogStrategy : public LogStrategy
    {
    public:
        FileLogStrategy(const std::string &path = defaultpath, const std::string &file = defaultfile)
            : _path(path),
              _file(file)
        {
            LockGuard lockguard(_mutex);
            if (std::filesystem::exists(_path))
            {
                return;
            }
            try
            {
                std::filesystem::create_directories(_path);
            }
            catch (const std::filesystem::filesystem_error &e)
            {
                std::cerr << e.what() << '
';
            }
        }
        void SyncLog(const std::string &message) override
        {
            LockGuard lockguard(_mutex);

            std::string filename = _path + (_path.back() == '/' ? "" : "/") + _file; // "./log/" + "my.log"
            std::ofstream out(filename, std::ios::app);                              // 追加写入的 方式打开
            if (!out.is_open())
            {
                return;
            }
            out << message << gsep;
            out.close();
        }
        ~FileLogStrategy()
        {
        }

    private:
        std::string _path; // 日志文件所在路径
        std::string _file; // 日志文件本身
        Mutex _mutex;
    };

    // 形成一条完整的日志&&根据上面的策略,选择不同的刷新方式

    // 1. 形成日志等级
    enum class LogLevel
    {
        DEBUG,
        INFO,
        WARNING,
        ERROR,
        FATAL
    };
    std::string Level2Str(LogLevel level)
    {
        switch (level)
        {
        case LogLevel::DEBUG:
            return "DEBUG";
        case LogLevel::INFO:
            return "INFO";
        case LogLevel::WARNING:
            return "WARNING";
        case LogLevel::ERROR:
            return "ERROR";
        case LogLevel::FATAL:
            return "FATAL";
        default:
            return "UNKNOWN";
        }
    }
    std::string GetTimeStamp()
    {
        time_t curr = time(nullptr);
        struct tm curr_tm;
        localtime_r(&curr, &curr_tm);
        char timebuffer[128];
        snprintf(timebuffer, sizeof(timebuffer),"%4d-%02d-%02d %02d:%02d:%02d",
            curr_tm.tm_year+1900,
            curr_tm.tm_mon+1,
            curr_tm.tm_mday,
            curr_tm.tm_hour,
            curr_tm.tm_min,
            curr_tm.tm_sec
        );
        return timebuffer;
    }

    // 1. 形成日志 && 2. 根据不同的策略,完成刷新
    class Logger
    {
    public:
        Logger()
        {
            EnableConsoleLogStrategy();
        }
        void EnableFileLogStrategy()
        {
            _fflush_strategy = std::make_unique();
        }
        void EnableConsoleLogStrategy()
        {
            _fflush_strategy = std::make_unique();
        }

        // 表示的是未来的一条日志
        class LogMessage
        {
        public:
            LogMessage(LogLevel &level, std::string &src_name, int line_number, Logger &logger)
                : _curr_time(GetTimeStamp()),
                  _level(level),
                  _pid(getpid()),
                  _src_name(src_name),
                  _line_number(line_number),
                  _logger(logger)
            {
                // 日志的左边部分,合并起来
                std::stringstream ss;
                ss << "[" << _curr_time << "] "
                   << "[" << Level2Str(_level) << "] "
                   << "[" << _pid << "] "
                   << "[" << _src_name << "] "
                   << "[" << _line_number << "] "
                   << "- ";
                _loginfo = ss.str();
            }
            // LogMessage() << "hell world" << "XXXX" << 3.14 << 1234
            template 
            LogMessage &operator<<(const T &info)
            {
                // a = b = c =d;
                // 日志的右半部分,可变的
                std::stringstream ss;
                ss << info;
                _loginfo += ss.str();
                return *this;
            }

            ~LogMessage()
            {
                if (_logger._fflush_strategy)
                {
                    _logger._fflush_strategy->SyncLog(_loginfo);
                }
            }

        private:
            std::string _curr_time;
            LogLevel _level;
            pid_t _pid;
            std::string _src_name;
            int _line_number;
            std::string _loginfo; // 合并之后,一条完整的信息
            Logger &_logger;
        };

        // 这里故意写成返回临时对象
        LogMessage operator()(LogLevel level, std::string name, int line)
        {
            return LogMessage(level, name, line, *this);
        }
        ~Logger()
        {
        }

    private:
        std::unique_ptr _fflush_strategy;
    };

    // 全局日志对象
    Logger logger;

    // 使用宏,简化用户操作,获取文件名和行号
    #define LOG(level) logger(level, __FILE__, __LINE__)
    #define Enable_Console_Log_Strategy() logger.EnableConsoleLogStrategy()
    #define Enable_File_Log_Strategy() logger.EnableFileLogStrategy()
}

#endif

Mutex.hpp

#pragma once
#include 
#include 

namespace MutexModule
{
    class Mutex
    {
    public:
        Mutex()
        {
            pthread_mutex_init(&_mutex, nullptr);
        }
        void Lock()
        {
            int n = pthread_mutex_lock(&_mutex);
            (void)n;
        }
        void Unlock()
        {
            int n = pthread_mutex_unlock(&_mutex);
            (void)n;
        }
        ~Mutex()
        {
            pthread_mutex_destroy(&_mutex);
        }
        pthread_mutex_t *Get()
        {
            return &_mutex;
        }
    private:
        pthread_mutex_t _mutex;
    };

    class LockGuard
    {
    public:
        LockGuard(Mutex &mutex):_mutex(mutex)
        {
            _mutex.Lock();
        }
        ~LockGuard()
        {
            _mutex.Unlock();
        }
    private:
        Mutex &_mutex;
    };
}

五、运行输出示例

这个例子跟上一个简易回声客户端与服务端一样,只不过多加了一个之前已经实现过的日志功能而已,操作还是相同的:

也可以使用makefile文件来进行操作:

.PHONY:all
all:Udpclient Udpserver

Udpclient:UdpClient.cc
	g++ -o $@ $^ -std=c++17 #-static
Udpserver:UdpServer.cc
	g++ -o $@ $^ -std=c++17

.PHONY:clean
clean:
	rm -f Udpclient Udpserver

首先我们运行和启动服务端:

然后我们再运行和启动客户端:

此时我们使用客户端给服务端发送一条信息,回车后然后可以看到服务端给客户端回显一条对应方法处理过的信息:

本文地址:https://www.yitenyun.com/4207.html

搜索文章

Tags

#服务器 #python #pip #conda #人工智能 #微信 #ios面试 #ios弱网 #断点续传 #ios开发 #objective-c #ios #ios缓存 #远程工作 #Trae #IDE #AI 原生集成开发环境 #Trae AI #kubernetes #笔记 #平面 #容器 #linux #学习方法 香港站群服务器 多IP服务器 香港站群 站群服务器 #运维 #学习 #银河麒麟高级服务器操作系统安装 #银河麒麟高级服务器V11配置 #设置基础软件仓库时出错 #银河麒高级服务器系统的实操教程 #生产级部署银河麒麟服务系统教程 #Linux系统的快速上手教程 #hadoop #hbase #hive #zookeeper #spark #kafka #flink #docker #科技 #深度学习 #自然语言处理 #神经网络 #kylin #arm #华为云 #部署上线 #动静分离 #Nginx #新人首发 #ARM服务器 # GLM-4.6V # 多模态推理 #分阶段策略 #模型协议 #飞牛nas #fnos #harmonyos #鸿蒙PC #大数据 #职场和发展 #程序员创富 #经验分享 #安卓 #fastapi #html #css #低代码 #爬虫 #音视频 #tcp/ip #网络 #qt #C++ #ide #java #开发语言 #前端 #javascript #架构 #github #git #PyTorch #模型训练 #星图GPU #开源 #语言模型 #大模型 #ai #ai大模型 #agent #langchain #数据库 #物联网 #websocket #Conda # 私有索引 # 包管理 #word #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #进程控制 #gemini #gemini国内访问 #gemini api #gemini中转搭建 #Cloudflare #unity #c# #游戏引擎 #aws #云计算 #MobaXterm #ubuntu #ssh #AI编程 #ci/cd #jenkins #gitlab #node.js #数信院生信服务器 #Rstudio #生信入门 #生信云服务器 #windows #RTP over RTSP #RTP over TCP #RTSP服务器 #RTP #TCP发送RTP #云原生 #iventoy #VmWare #OpenEuler #Reactor #自动化 #ansible #后端 #区块链 #测试用例 #生活 #内网穿透 #cpolar #儿童书籍 #儿童诗歌 #童话故事 #经典好书 #儿童文学 #好书推荐 #经典文学作品 #驱动开发 #c++ #风控模型 #决策盲区 #nginx #私有化部署 #centos #svn #openHiTLS #TLCP #DTLCP #密码学 #商用密码算法 #算法 #牛客周赛 #flutter #缓存 #Harbor #FTP服务器 #fabric #postgresql #http #项目 #高并发 #矩阵 #线性代数 #AI运算 #向量 #android #腾讯云 #sql #AIGC #agi #serverless #diskinfo # TensorFlow # 磁盘健康 #vscode #mobaxterm #计算机视觉 #java-ee #microsoft #文心一言 #AI智能体 #dify #log4j #ollama #分布式 #华为 #iBMC #UltraISO #多个客户端访问 #IO多路复用 #回显服务器 #TCP相关API #mcu #vue上传解决方案 #vue断点续传 #vue分片上传下载 #vue分块上传下载 #spring cloud #spring #vue.js #mysql #json #prometheus #大模型学习 #AI大模型 #大模型教程 #大模型入门 #mcp #mcp server #AI实战 #阿里云 #进程 #pycharm #php #jar #Dell #PowerEdge620 #内存 #硬盘 #RAID5 #企业开发 #ERP #项目实践 #.NET开发 #C#编程 #编程与数学 #内存治理 #django #flask #c语言 #pytorch #select #重构 #机器学习 #PyCharm # 远程调试 # YOLOFuse #网络协议 #信息与通信 #uni-app #小程序 #notepad++ #开源软件 #rocketmq #程序人生 #科研 #博士 #Ubuntu服务器 #硬盘扩容 #命令行操作 #VMware #jmeter #功能测试 #软件测试 #自动化测试 #鸿蒙 #web #webdav #chatgpt #DeepSeek #AI #DS随心转 #数学建模 #2026年美赛C题代码 #2026年美赛 #安全 #spring boot #数据结构 #嵌入式 #超算服务器 #算力 #高性能计算 #仿真分析工作站 #es安装 #ecmascript #elementui #udp #产品经理 #ui #团队开发 #墨刀 #figma #散列表 #哈希算法 #leetcode #jvm #钉钉 #机器人 #服务器繁忙 #FL Studio #FLStudio #FL Studio2025 #FL Studio2026 #FL Studio25 #FL Studio26 #水果软件 #企业微信 #计算机网络 #蓝桥杯 #个人开发 #正则 #正则表达式 #课程设计 #jetty #redis #硬件工程 #Ansible # 自动化部署 # VibeThinker #powerpoint #Com #golang #游戏 #mvp #设计模式 #MCP #MCP服务器 #京东云 #性能优化 #深度优先 #DFS #vllm #Streamlit #Qwen #本地部署 #AI聊天机器人 #数据集 #LLM #vim #gcc #yum #FaceFusion # Token调度 # 显存优化 #mmap #nio #Android #Bluedroid #rabbitmq #protobuf #设备驱动 #芯片资料 #网卡 #毕业设计 #scrapy #todesk #酒店客房管理系统 #毕设 #论文 #阻塞队列 #生产者消费者模型 #服务器崩坏原因 #wsl #L2C #勒让德到切比雪夫 #数据仓库 #vue3 #天地图 #403 Forbidden #天地图403错误 #服务器403问题 #天地图API #部署报错 #claude #我的世界 #操作系统 #AI产品经理 #大模型开发 #svm #amdgpu #kfd #ROCm #网络安全 #web安全 #大语言模型 #长文本处理 #GLM-4 #Triton推理 #守护进程 #复用 #screen #everything #arm开发 #嵌入式硬件 #智能手机 #系统架构 #shell #CPU利用率 #鸭科夫 #逃离鸭科夫 #鸭科夫联机 #鸭科夫异地联机 #开服 #Linux #TCP #线程 #线程池 #ffmpeg #单片机 #stm32 #贪心算法 #sqlserver #ModelEngine #边缘计算 #gpu算力 #DisM++ # 系统维护 #金融 #金融投资Agent #Agent #debian #autosar #AI论文写作工具 #学术论文创作 #论文效率提升 #MBA论文写作 #SSH # ProxyJump # 跳板机 #transformer #cnn #信息可视化 #claude code #codex #code cli #ccusage #Ascend #MindIE #oracle #银河麒麟操作系统 #openssh #华为交换机 #信创终端 #ssl #twitter #线性回归 #语音识别 #opencv #里氏替换原则 #幼儿园 #园长 #幼教 #数模美赛 #matlab #openresty #lua #n8n #openclaw #电气工程 #C# #PLC #游戏私服 #云服务器 #sizeof和strlen区别 #sizeof #strlen #计算数据类型字节数 #计算字符串长度 #abtest #SSH Agent Forwarding # PyTorch # 容器化 #流量运营 #用户运营 #AI写作 #树莓派4b安装系统 #需求分析 #scala #测试工具 #压力测试 #全能视频处理软件 #视频裁剪工具 #视频合并工具 #视频压缩工具 #视频字幕提取 #视频处理工具 #程序员 #自动驾驶 #Canal #https #社科数据 #数据分析 #数据挖掘 #数据统计 #经管数据 #adb #pdf #fiddler #PowerBI #企业 #RAGFlow #DeepSeek-R1 #ddos #grafana #googlecloud #搜索引擎 #智慧校园解决方案 #智慧校园一体化平台 #智慧校园选型 #智慧校园采购 #智慧校园软件 #智慧校园专项资金 #智慧校园定制开发 #asp.net大文件上传 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #asp.net上传文件夹 #测试流程 #金融项目实战 #P2P #webrtc #银河麒麟 #系统升级 #信创 #国产化 #Modbus-TCP #ping通服务器 #读不了内网数据库 #bug菌问答团队 #流程图 #论文阅读 #论文笔记 #SSM 框架 #孕期健康 #产品服务推荐 #推荐系统 #用户交互 #Windows 更新 #azure #数码相机 #Coze工作流 #AI Agent指挥官 #多智能体系统 #HBA卡 #RAID卡 #编辑器 #电脑 #VS Code调试配置 #无人机 #Deepoc #具身模型 #开发板 #未来 #ida #Chat平台 #ARM架构 #asp.net #考研 #软件工程 #中间件 #tdengine #时序数据库 #制造 #涛思数据 #研发管理 #禅道 #禅道云端部署 #1024程序员节 #zabbix #STUN # TURN # NAT穿透 #GPU服务器 #8U #硬件架构 #RAID #RAID技术 #磁盘 #存储 #Node.js #漏洞检测 #CVE-2025-27210 #ROS #导航网 #unity3d #服务器框架 #Fantasy #elasticsearch #OBC #H5 #跨域 #发布上线后跨域报错 #请求接口跨域问题解决 #跨域请求代理配置 #request浏览器跨域 #零售 #游戏机 #3d #visual studio code #振镜 #振镜焊接 #求职招聘 #面试 #生信 #ProCAST2025 #ProCast #脱模 #顶出 #应力计算 #铸造仿真 #变形计算 #java大文件上传 #java大文件秒传 #java大文件上传下载 #java文件传输解决方案 #链表 #journalctl #laravel #wordpress #雨云 #whisper #LobeChat #vLLM #GPU加速 #selenium #RAG #全链路优化 #实战教程 #YOLO #分类 #ssm #微信小程序 #计算机 #连锁药店 #连锁店 #若依 #quartz #框架 #目标检测 #YOLO26 #YOLO11 #SSH反向隧道 # Miniconda # Jupyter远程访问 #.net #homelab #Lattepanda #Jellyfin #Plex #Emby #Kodi #智能路由器 #TensorRT # Triton # 推理优化 #iphone #其他 #聚类 #环境搭建 #凤希AI伴侣 #建筑缺陷 #红外 #双指针 #我的世界服务器搭建 #minecraft #逻辑回归 #流量监控 #架构师 #软考 #系统架构师 #epoll #高级IO #MC #数组 #信号处理 #目标跟踪 #几何学 #拓扑学 #链表的销毁 #链表的排序 #链表倒置 #判断链表是否有环 #AB包 #ESXi #硬件 #LoRA # RTX 3090 # lora-scripts #react.js #vuejs #运营 #React安全 #漏洞分析 #Next.js #反序列化漏洞 #eBPF #联机教程 #局域网联机 #局域网联机教程 #局域网游戏 #EMC存储 #存储维护 #NetApp存储 #高仿永硕E盘的个人网盘系统源码 #学习笔记 #jdk #Qwen3-14B # 大模型部署 # 私有化AI #ip #vp9 #土地承包延包 #领码SPARK #aPaaS+iPaaS #数字化转型 #智能审核 #档案数字化 #CFD #AutoDL #LangGraph #模型上下文协议 #MultiServerMCPC #load_mcp_tools #load_mcp_prompt #screen 命令 #运维开发 #paddlepaddle #macos # GLM-TTS # 数据安全 #支付 #fpga开发 #LVDS #高速ADC #DDR #Gunicorn #WSGI #Flask #并发模型 #容器化 #Python #性能调优 #HeyGem # 远程访问 # 服务器IP配置 #MS #Materials #结构体 #2026AI元年 #年度趋势 #国产PLM #瑞华丽PLM #瑞华丽 #PLM #多线程 #性能调优策略 #双锁实现细节 #动态分配节点内存 #ai编程 #SMTP # 内容安全 # Qwen3Guard #X11转发 #Miniconda #llama #ceph #5G #平板 #交通物流 #智能硬件 #SAP #ebs #metaerp #oracle ebs #改行学it #创业创新 #RustDesk # IndexTTS 2.0 # 远程运维 #蓝耘智算 #插件 #排序算法 #插入排序 #r-tree #框架搭建 #TFTP #客户端 #glibc #C语言 #VibeVoice # 语音合成 #tensorflow #可信计算技术 #winscp #智能体 #工厂模式 #Proxmox VE #虚拟化 #ONLYOFFICE #MCP 服务器 #智慧城市 #推荐算法 #apache #tomcat #海外短剧 #海外短剧app开发 #海外短剧系统开发 #短剧APP #短剧APP开发 #短剧系统开发 #海外短剧项目 # 双因素认证 #飞书 #log #NPU #CANN #前端框架 #dreamweaver #浏览器自动化 #python #PyTorch 特性 #动态计算图 #张量(Tensor) #自动求导Autograd #GPU 加速 #生态系统与社区支持 #与其他框架的对比 #cascadeur #设计师 #游戏美术 #游戏策划 #Docker #cursor #进程创建与终止 #vue #spine #远程桌面 #远程控制 #llm #UDP的API使用 #chrome #智能一卡通 #门禁一卡通 #梯控一卡通 #电梯一卡通 #消费一卡通 #一卡通 #考勤一卡通 #IndexTTS2 # 阿里云安骑士 # 木马查杀 #RK3576 #瑞芯微 #硬件设计 #IndexTTS 2.0 #本地化部署 #bash #tcpdump #ngrok #embedding #RPA #影刀RPA #AI办公 #车辆排放 #Spring AI #STDIO协议 #Streamable-HTTP #McpTool注解 #服务器能力 #paddleocr #SRS #流媒体 #直播 #mybatis #版本控制 #Git入门 #开发工具 #代码托管 #pencil #pencil.dev #设计 #Anything-LLM #IDC服务器 #贴图 #材质 #工具集 #UDP套接字编程 #UDP协议 #网络测试 #个人博客 #lvs #负载均衡 #sqlite #pjsip #nas #音乐分类 #音频分析 #ViT模型 #Gradio应用 #鼠大侠网络验证系统源码 #Triton # CUDA #p2p #intellij-idea #database #idea #Nacos #微服务 #海外服务器安装宝塔面板 #powerbi #翻译 #开源工具 #状态模式 #嵌入式编译 #ccache #distcc #910B #SSH保活 #远程开发 #puppeteer #openlayers #bmap #tile #server # GLM-4.6V-Flash-WEB # 显卡驱动备份 #简单数论 #埃氏筛法 #openEuler #Hadoop #DIY机器人工房 #nacos #银河麒麟aarch64 #uvicorn #uvloop #asgi #event #迁移重构 #数据安全 #漏洞 #代码迁移 #yolov12 #研究生life #restful #ajax #Claude #视频去字幕 #文生视频 #CogVideoX #AI部署 #零代码平台 #AI开发 #Karalon #AI Test #prompt #信令服务器 #Janus #MediaSoup #SA-PEKS # 关键词猜测攻击 # 盲签名 # 限速机制 #模版 #函数 #类 #笔试 #图像处理 #yolo #Jetty # CosyVoice3 # 嵌入式服务器 #mamba #esp32教程 #高品质会员管理系统 #收银系统 #同城配送 #最好用的电商系统 #最好用的系统 #推荐的前十系统 #JAVA PHP 小程序 #LabVIEW知识 #LabVIEW程序 #labview #LabVIEW功能 #firefox #WEB #CMake #Make #C/C++ #堡垒机 #安恒明御堡垒机 #windterm #rust # 公钥认证 #vps #simulink #clickhouse ##程序员和算法的浪漫 #Playbook #AI服务器 #北京百思可瑞教育 #百思可瑞教育 #北京百思教育 #NAS #飞牛NAS #监控 #NVR #EasyNVR #JAVA #Java #risc-v #ms-swift # 一锤定音 # 大模型微调 #deepseek #机器视觉 #6D位姿 #SSH公钥认证 # 安全加固 #Fun-ASR # 语音识别 # WebUI #cpp #Shiro #CVE-2016-4437 #部署 #人脸识别 #人脸核身 #活体检测 #身份认证与人脸对比 #微信公众号 #三维重建 #高斯溅射 #昇腾300I DUO #产品运营 #1panel #vmware #windbg分析蓝屏教程 #集成测试 #eclipse #servlet #vnstat #汇编 #c++20 # 远程连接 #ICPC #说话人验证 #声纹识别 #CAM++ #云开发 #PTP_1588 #gPTP #农产品物流管理 #物流管理系统 #农产品物流系统 #农产品物流 #matplotlib #xss #安全架构 #unix #攻防演练 #Java web #红队 #dubbo #maven #opc ua #opc #typescript #npm #压枪 #VPS #搭建 #gitea #excel #API限流 # 频率限制 # 令牌桶算法 #TTS私有化 # IndexTTS # 音色克隆 #VSCode # SSH #k8s #黑群晖 #虚拟机 #无U盘 #纯小白 #指针 #anaconda #虚拟环境 #Windows #SSH跳板机 # Python3.11 #东方仙盟 #进程等待 #wait #waitpid # HiChatBox # 离线AI #蓝湖 #Axure原型发布 #TCP服务器 #开发实战 #网站 #截图工具 #批量处理图片 #图片格式转换 #图片裁剪 #markdown #建站 #门禁 #梯控 #智能梯控 #结构与算法 #源代码管理 #turn #黑客技术 #渗透测试 #网安应急响应 #微PE # GLM # 服务连通性 #文件上传漏洞 #可撤销IBE #服务器辅助 #私钥更新 #安全性证明 #双线性Diffie-Hellman #ambari #Android16 #音频性能实战 #音频进阶 #单元测试 #muduo库 #uv #uvx #uv pip #npx #Ruff #pytest #扩展屏应用开发 #android runtime # 高并发 #CTF #数据恢复 #视频恢复 #视频修复 #RAID5恢复 #流媒体服务器恢复 #TLS协议 #HTTPS #漏洞修复 #运维安全 #SSE # AI翻译机 # 实时翻译 #DDD #tdd #Tokio # GPU服务器 # tmux #react native #昇腾 #SSH跳转 #策略模式 # GPU集群 #聊天小程序 #RSO #机器人操作系统 #NFC #智能公交 #服务器计费 #FP-增长 #Anaconda配置云虚拟环境 #MQTT协议 #性能测试 #LoadRunner #能源 #汽车 #vivado license #CVE-2025-68143 #CVE-2025-68144 #CVE-2025-68145 #html5 #weston #x11 #x11显示服务器 #服务器解析漏洞 #具身智能 #证书 #kmeans #数字孪生 #三维可视化 # 远程开发 # Qwen3Guard-Gen-8B #esb接口 #走处理类报异常 #树莓派 #N8N #交互 #GB/T4857 #GB/T4857.17 #GB/T4857测试 #集成学习 # 数字人系统 # 远程部署 #Cpolar #国庆假期 #服务器告警 #smtp #smtp服务器 #PHP #intellij idea #WinDbg #Windows调试 #内存转储分析 #AI+ #coze #AI入门 #AI赋能 #计组 #数电 #cosmic #rustdesk #连接数据库报错 #AI视频创作系统 #AI视频创作 #AI创作系统 #AI视频生成 #AI工具 #AI创作工具 #fs7TF #智能家居 #鲲鹏 #npu #React #Next #CVE-2025-55182 #RSC #大剑师 #nodejs面试题 #DNS #SSH免密登录 #Discord机器人 #云部署 #程序那些事 #SFTP #HCIA-Datacom #H12-811 #题库 #最新题库 #运维工具 #YOLOFuse # Base64编码 # 多模态检测 #ipmitool #BMC # 黑屏模式 # TTS服务器 #C #领域驱动 #JumpServer #bootstrap #移动端h5网页 #调用浏览器摄像头并拍照 #开启摄像头权限 #拍照后查看与上传服务器端 #摄像头黑屏打不开问题 #处理器 #静脉曲张 #腿部健康 #SPA #单页应用 #web3.py #上下文工程 #langgraph #意图识别 #单例模式 #远程访问 #远程办公 #飞网 #安全高效 #配置简单 #系统安全 #分布式数据库 #集中式数据库 #业务需求 #选型误 #ESP32 #传感器 #MicroPython #入侵 #日志排查 #teamviewer #文件IO #输入输出流 #数据采集 #浏览器指纹 #麒麟OS #逆向工程 #swagger #网络配置实战 #Web/FTP 服务访问 #计算机网络实验 #外网访问内网服务器 #Cisco 路由器配置 #静态端口映射 #网络运维 #防火墙 #elk #jupyter #Socket网络编程 # 目标检测 #Rust #异步编程 #系统编程 #Pin #http服务器 #chat #edge #迭代器模式 #观察者模式 #机器人学习 #CosyVoice3 # IP配置 # 0.0.0.0 #mariadb # 大模型 # 模型训练 #CLI #JavaScript #langgraph.json #iot #raid #raid阵列 #springboot #LangFlow # 轻量化镜像 # 边缘计算 #milvus #知识库 #web server #请求处理流程 #知识 #agentic bi #论文复现 #远程连接 #Host #SSRF #娱乐 #敏捷流程 #政务 #语音生成 #TTS #IO #AI赋能盾构隧道巡检 #开启基建安全新篇章 #以注意力为核心 #YOLOv12 #AI隧道盾构场景 #盾构管壁缺陷病害异常检测预警 #隧道病害缺陷检测 # 水冷服务器 # 风冷服务器 #服务器线程 # SSL通信 # 动态结构体 #VoxCPM-1.5-TTS # 云端GPU # PyCharm宕机 #rdp #AI技术 #AI生成 # outputs目录 # 自动化 #学术生涯规划 #CCF目录 #基金申请 #职称评定 #论文发表 #科研评价 #顶会顶刊 #蓝牙 #LE Audio #BAP #go #Clawdbot #个人助理 #数字员工 #libosinfo #SEO优化 #KMS #slmgr #宝塔面板部署RustDesk #RustDesk远程控制手机 #手机远程控制 #esp32 arduino #HistoryServer #Spark #YARN #jobhistory #可再生能源 #绿色算力 #风电 #sglang #节日 #ZooKeeper #ZooKeeper面试题 #面试宝典 #深入解析 #Kuikly #openharmony #ComfyUI # 推理服务器 #内存接口 # 澜起科技 # 服务器主板 #IPv6 #Fluentd #Sonic #日志采集 #动态规划 #面向对象 #xlwings #Excel #模拟退火算法 # REST API # keep-alive #安全威胁分析 #源码 #闲置物品交易系统 #x86_64 #数字人系统 #EN4FE #windows11 #系统修复 #自由表达演说平台 #演说 #文件传输 #电脑文件传输 #电脑传输文件 #电脑怎么传输文件到另一台电脑 #电脑传输文件到另一台电脑 #性能 #优化 #RAM #flume #mongodb #rtsp #转发 #范式 #UDP #YOLOv8 # Docker镜像 #gpu #nvcc #cuda #nvidia #文件管理 #文件服务器 #国产开源制品管理工具 #Hadess #一文上手 #群晖 #音乐 #IntelliJ IDEA #Spring Boot #neo4j #NoSQL #SQL #OPCUA #visual studio #pandas #ET模式 #非阻塞 #高并发服务器 #RXT4090显卡 #RTX4090 #深度学习服务器 #硬件选型 #万悟 #联通元景 #镜像 #就业 #OSS #idm #echarts # 服务器IP # 端口7860 #健身房预约系统 #健身房管理系统 #健身管理系统 # 硬件配置 #算力一体机 #ai算力服务器 #ThingsBoard MCP #青少年编程 #wps # 高并发部署 #空间计算 #原型模式 # 云服务器 # 服务器IP访问 # 端口映射 #CSDN #寄存器 #gateway #Comate #遛狗 #bug #代理 #SMP(软件制作平台) #EOM(企业经营模型) #应用系统 #ue4 #ue5 #DedicatedServer #独立服务器 #专用服务器 #tornado #webpack #H3C #学术写作辅助 #论文创作效率提升 #AI写论文实测 #C++ UA Server #SDK #跨平台开发 #AI大模型应用开发 #项目申报系统 #项目申报管理 #项目申报 #企业项目申报 #wpf #arm64 #长文本理解 #glm-4 #推理部署 #串口服务器 #Modbus #MOXA #GATT服务器 #蓝牙低功耗 #UOS #海光K100 #统信 #reactjs #web3 #Go并发 #高并发架构 #Goroutine #系统设计 #Dify #密码 #CUDA #电商 #FASTMCP #memory mcp #Cursor #docker-compose #Tetrazine-Acid #1380500-92-4 #postman #UEFI #BIOS #Legacy BIOS #隐函数 #常微分方程 #偏微分方程 #线性微分方程 #线性方程组 #非线性方程组 #复变函数 #le audio #低功耗音频 #通信 #连接 #KMS 激活 #AI智能棋盘 #Rock Pi S #游戏程序 #IFix #视觉检测 #Buck #NVIDIA #交错并联 #DGX #递归 #线性dp #webgl #编程 #c++高并发 #百万并发 #Termux #Samba #SSH别名 #CS2 #debian13 #BoringSSL #gerrit #云计算运维 #asp.net上传大文件 #信创国产化 #达梦数据库 # ARM服务器 # 鲲鹏 #ShaderGraph #图形 #http头信息 #uip #VMware Workstation16 #服务器操作系统 #音诺ai翻译机 #AI翻译机 # Ampere Altra Max #支持向量机 #启发式算法 #GB28181 #SIP信令 #SpringBoot #视频监控 #WT-2026-0001 #QVD-2026-4572 #smartermail #ICE #系统管理 #服务 #视频 #全文检索 #银河麒麟服务器系统 # 大模型推理 #screen命令 #卷积神经网络 #GPU ##租显卡 #管道Pipe #system V #技术美术 #用户体验 #区间dp #二进制枚举 #图论 #Kylin-Server #国产操作系统 #服务器安装 #短剧 #短剧小程序 #短剧系统 #微剧 #H5网页 #网页白屏 #H5页面空白 #资源加载问题 #打包部署后网页打不开 #HBuilderX #A2A #GenAI #域名注册 #新媒体运营 #网站建设 #国外域名 #VMWare Tool #easyui #大学生 #大作业 #心理健康服务平台 #心理健康系统 #心理服务平台 #心理健康小程序 #题解 #图 #dijkstra #迪杰斯特拉 #AI-native #dba #国产化OS #程序开发 #程序设计 #计算机毕业设计 #idc #服务器开启 TLS v1.2 #IISCrypto 使用教程 #TLS 协议配置 #IIS 安全设置 #服务器运维工具 #esp32 #mosquito # 批量管理 #NSP #下一状态预测 #aigc #ASR #SenseVoice #outlook #错误代码2603 #无网络连接 #2603 #mtgsig #美团医药 #美团医药mtgsig #美团医药mtgsig1.2 #实时检测 #网络编程 #Socket #套接字 #I/O多路复用 #字节序 #测试覆盖率 #可用性测试 #DAG #nodejs #云服务器选购 #Saas #CPU #计算几何 #斜率 #方向归一化 #叉积 #智能体从0到1 #新手入门 #samba #练习 #基础练习 #循环 #九九乘法表 #计算机实现 #SQL调优 #EXPLAIN #慢查询日志 #分布式架构 #后端开发 #dynadot #域名 #HarmonyOS APP #lstm #旅游 #AI电商客服 #随机森林 #经济学 #网路编程 #银河麒麟部署 #银河麒麟部署文档 #银河麒麟linux #银河麒麟linux部署教程 #声源定位 #MUSIC #JNI #晶振 #测评 #CCE #Dify-LLM #Flexus #Moltbook #sentinel #resnet50 #分类识别训练 #媒体 #OpenManage #AI 推理 #NV #Spire.Office #隐私合规 #网络安全保险 #法律风险 #风险管理 #memcache #ServBay #C2000 #TI #实时控制MCU #AI服务器电源 #r语言 #Llama-Factory # 树莓派 # ARM架构 #TRO #TRO侵权 #TRO和解 #Python3.11 #Xshell #Finalshell #生物信息学 #组学 #ranger #MySQL8.0 #统信UOS #win10 #qemu #远程软件 #STDIO传输 #SSE传输 #WebMVC #WebFlux #clawdbot #ansys #ansys问题解决办法 #服务器IO模型 #非阻塞轮询模型 #多任务并发模型 #异步信号模型 #多路复用模型 #快递盒检测检测系统 # Connection refused #智能体来了 #智能体对传统行业冲击 #行业转型 #HarmonyOS #工业级串口服务器 #串口转以太网 #串口设备联网通讯模块 #串口服务器选型 #blender #vertx #vert.x #vertx4 #runOnContext #代理模式 #Spring AOP #Spring #0day漏洞 #DDoS攻击 #漏洞排查 #gRPC #注册中心 #odoo #win11 #Apple AI #Apple 人工智能 #FoundationModel #Summarize #SwiftUI #嵌入式开发 # DIY主机 # 交叉编译 #Smokeping #路由器 #xeon #pve #Java面试 #Java程序员 #Redis #分布式锁 # 服务器配置 # GPU #galeweather.cn #高精度天气预报数据 #光伏功率预测 #风电功率预测 #高精度气象 #appche #视觉理解 #Moondream2 #多模态AI #语音合成 #c #企业级存储 #网络设备 #muduo #TcpServer #accept #大模型应用 #API调用 #PyInstaller打包运行 #服务端部署 #ftp #sftp #勒索病毒 #勒索软件 #加密算法 #.bixi勒索病毒 #数据加密 #CS336 #Assignment #Experiments #TinyStories #Ablation #实时音视频 #业界资讯 #zotero #WebDAV #同步失败 #量子计算 #WinSCP 下载安装教程 #FTP工具 #服务器文件传输 #JT/T808 #车联网 #车载终端 #模拟器 #仿真器 #开发测试 #copilot #硬盘克隆 #DiskGenius #mapreduce #Langchain-Chatchat # 国产化服务器 # 信创 #opc模拟服务器 #欧拉 #儿童AI #图像生成 #报表制作 #职场 #数据可视化 #用数据讲故事 #AE #手机h5网页浏览器 #安卓app #苹果ios APP #手机电脑开启摄像头并排查 #Keycloak #Quarkus #AI编程需求分析 #hibernate #麒麟 #Syslog #系统日志 #日志分析 #日志监控 #生产服务器问题查询 #日志过滤 #Autodl私有云 #深度服务器配置 #ArkUI #ArkTS #鸿蒙开发 # 自动化运维 #cocos2d #图形渲染 #stl #IIS Crypto #AITechLab #cpp-python #CUDA版本 #n8n解惑 #漏洞挖掘 #Exchange #铁路桥梁 #DIC技术 #箱梁试验 #裂纹监测 #四点弯曲 #ARM64 # DDColor # ComfyUI #大模型部署 #mindie #大模型推理 #Ubuntu #ESP32编译服务器 #Ping #DNS域名解析 #地理 #遥感 #POC #问答 #交付 #taro #仙盟创梦IDE #AI应用编程 #dlms #dlms协议 #逻辑设备 #逻辑设置间权限 #七年级上册数学 #有理数 #有理数的加法法则 #绝对值 #游戏服务器断线 #wireshark #广播 #组播 #并发服务器 #主板 #总体设计 #电源树 #框图 #Minecraft #Minecraft服务器 #PaperMC #我的世界服务器 #前端开发 # 服务器迁移 # 回滚方案 #Archcraft #转行 #nfs #iscsi #clamav #eureka #Linly-Talker # 数字人 # 服务器稳定性 #外卖配送 #kong #Kong Audio #Kong Audio3 #KongAudio3 #空音3 #空音 #中国民乐 #企业存储 #RustFS #对象存储 #高可用 #三维 #3D #榛樿鍒嗙被 #命令模式 #边缘AI # Kontron # SMARC-sAMX8 #传统行业 #scanf #printf #getchar #putchar #cin #cout #CNAS #CMA #程序文件 #人脸活体检测 #live-pusher #动作引导 #张嘴眨眼摇头 #苹果ios安卓完美兼容 #模块 #CVE-2025-61686 #路径遍历高危漏洞 #多模态 #微调 #超参 #LLamafactory #SMARC #ARM #工程实践 #ipv6 # 代理转发 #duckdb #图像识别 #高考 #cesium #可视化 #V11 #kylinos #TURN # WebRTC #web服务器 #KMS激活 #gpt #API #排序 #Linux多线程 # 智能运维 # 性能瓶颈分析 # GPU租赁 # 自建服务器 #Spring源码 #devops #list #aiohttp #asyncio #异步 #I/O模型 #并发 #水平触发、边缘触发 #多路复用 #软件 #本地生活 #电商系统 #商城 #MinIO服务器启动与配置详解 #vrrp #脑裂 #keepalived主备 #高可用主备都持有VIP #SSH复用 # 模型微调 #磁盘配额 #存储管理 #形考作业 #国家开放大学 #系统运维 #自动化运维 #DHCP #.netcore #注入漏洞 #Aluminium #Google #实体经济 #商业模式 #软件开发 #数智红包 #商业变革 #创业干货 #语义搜索 #嵌入模型 #Qwen3 #AI推理 #材料工程 #智能电视 #挖漏洞 #攻击溯源 #mssql # ControlMaster #tcp/ip #网络 #Tracker 服务器 #响应最快 #torrent 下载 #2026年 #Aria2 可用 #迅雷可用 #BT工具通用 #net core #kestrel #web-server #asp.net-core #safari #Zabbix #b树 #因果学习 #nmodbus4类库使用教程 #Puppet # IndexTTS2 # TTS #新浪微博 #传媒 #职场发展 #交换机 #三层交换机 #个人电脑 #MC群组服务器 #UDP服务器 #recvfrom函数 #claude-code #高精度农业气象 #Ward #文本生成 #CPU推理 #WAN2.2 #4U8卡 AI 服务器 ##AI 服务器选型指南 #GPU 互联 #GPU算力 #日志模块 #sklearn # 权限修复 #dash #温湿度监控 #WhatsApp通知 #IoT #MySQL #Moltbot #编程助手 #nosql #超时设置 #客户端/服务器 #挖矿 #Linux病毒 #人形机器人 #人机交互 #xml #统信操作系统 #vncdotool #链接VNC服务器 #如何隐藏光标 #投标 #标书制作 #电梯 #电梯运力 #电梯门禁 #bond #服务器链路聚合 #网卡绑定 #数据报系统 #华为od #华为机试 #网络安全大赛 #Gateway #认证服务器集成详解 #FHSS #uniapp #合法域名校验出错 #服务器域名配置不生效 #request域名配置 #已经配置好了但还是报错 #uniapp微信小程序 #算力建设 #效率神器 #办公技巧 #自动化工具 #Windows技巧 #打工人必备 #智能制造 #供应链管理 #工业工程 #库存管理 #RK3588 #RK3588J #评估板 #核心板 #SSH密钥 #ETL管道 #向量存储 #数据预处理 #DocumentReader #后端框架 #MCP服务器注解 #异步支持 #方法筛选 #声明式编程 #自动筛选机制 #rtmp #pxe #free #vmstat #sar #hdfs #网络攻击模型 #pyqt #QQbot #QQ #FRP # OTA升级 # 黄山派 #内网 # 网络延迟 #WRF #WRFDA #公共MQTT服务器 #代理服务器 #Matrox MIL #二次开发 #CMC #跳槽 #工作 #sql注入 #懒汉式 #恶汉式 #人大金仓 #Kingbase #雨云服务器 #教程 #MCSM面板 #租显卡 #训练推理 #istio #服务发现 # 串口服务器 # NPort5630 #多进程 #python技巧 #CA证书 #OpenHarmony #bigtop #hdp #hue #kerberos #轻量化 #低配服务器 #余行补位 #意义对谈 #余行论 #领导者定义计划 # 批量部署 #docker安装seata #星际航行 # 键鼠锁定 #cpu #工程设计 #预混 #扩散 #燃烧知识 #层流 #湍流 #numpy #反向代理 #rag #ARMv8 #内存模型 #内存屏障 #RWK35xx #语音流 #实时传输 #node #参数估计 #矩估计 #概率论 #三种参数 #参数的校验 #fastAPI #人脸识别sdk #视频编解码 #canvas层级太高 #canvas遮挡问题 #盖住其他元素 #苹果ios手机 #安卓手机 #调整画布层级 #测速 #iperf #iperf3 #express #cherry studio #moltbot # child_process #分子动力学 #化工仿真 #gmssh #宝塔 #小智 #系统安装 #决策树 #麦克风权限 #访问麦克风并录制音频 #麦克风录制音频后在线播放 #用户拒绝访问麦克风权限怎么办 #uniapp 安卓 苹果ios #将音频保存本地或上传服务器 #GLM-4.6V-Flash-WEB # AI视觉 # 本地部署 #基础语法 #标识符 #常量与变量 #数据类型 #运算符与表达式 #程序定制 #毕设代做 #课设 #scikit-learn #运动 #百度 #百度文库 #爱企查 #旋转验证码 #验证码识别 #开关电源 #热敏电阻 #PTC热敏电阻 #AI Agent #开发者工具 #语义检索 #向量嵌入 #实在Agent #小艺 #搜索 #glances #SQL注入主机 #Coturn #电子电气架构 #系统工程与系统架构的内涵 #Routine #健康医疗 #gnu #remote-ssh #强化学习 #策略梯度 #REINFORCE #蒙特卡洛 #AI应用 #ueditor导入word #L6 #L10 #L9 #戴尔服务器 #戴尔730 #装系统 #junit #阿里云RDS #数据访问 #LED #设备树 #GPIO #composer #symfony #java-zookeeper #poll #coffeescript #软件需求 #OCR #文字检测 #lucene #warp #个性化推荐 #BERT模型 #Prometheus #DooTask #DuckDB #协议 #身体实验室 #健康认知重构 #系统思维 #微行动 #NEAT效应 #亚健康自救 #ICT人 #思爱普 #SAP S/4HANA #ABAP #NetWeaver # 环境迁移 #xshell #host key #mvc #bytebase #西门子 #汇川 #Blazor #spring ai #oauth2 # 局域网访问 # 批量处理 #江协 #瑞萨 #OLED屏幕移植 #运维 #MinIO # 高温监控 #夏天云 #夏天云数据 #华为od机试 #华为od机考 #华为od最新上机考试题库 #华为OD题库 #华为OD机试双机位C卷 #od机考题库 #企业微信机器人 #本地大模型 #2025年 #AI工具集成 #容器化部署 #css3 #rsync # 数据同步 #一周会议与活动 #ICLR #CCF #自动化巡检 #claudeCode #content7 #基金 #股票 #YOLO识别 #YOLO环境搭建Windows #YOLO环境搭建Ubuntu #Python办公自动化 #Python办公 #科普 # ms-swift #PN 结 #ossinsight #超算中心 #PBS #lsf #adobe #数据迁移 #fork函数 #进程创建 #进程终止 #期刊 #SCI #session #okhttp #计算机外设 #boltbot #Taiji #格式工厂 #Beidou #北斗 #SSR #信息安全 #信息收集 # AI部署 #VMware创建虚拟机 #远程更新 #缓存更新 #多指令适配 #物料关联计划 #防毒面罩 #防尘面罩 #Qwen3-VL # 服务状态监控 # 视觉语言模型 #m3u8 #HLS #移动端H5网页 #APP安卓苹果ios #监控画面 直播视频流 #Arduino BLDC #核辐射区域探测机器人 #AI教程 #jquery #JADX-AI 插件 #starrocks #OpenAI #故障 #tekton #二值化 #Canny边缘检测 #轮廓检测 #透视变换