• 第四章 Linux套接字通信:4.服务器并发

第四章 Linux套接字通信:4.服务器并发

2025-05-07 00:57:07 0 阅读

1. 单线程/进程

转载自 服务器并发 | 爱编程的大丙

在TCP通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在介绍TCP通信流程的时候,提供的服务器代码却不能完成这样的需求

  • accept():如果服务器端没有新客户端连接,阻塞当前进程/线程如果检测到新连接解除阻塞,建立连接
  • read():如果通信的套接字对应的读缓冲区没有数据,阻塞当前进程/线程,检测到数据解除阻塞,接收数据
  • write():如果通信的套接字写缓冲区被写满了,阻塞当前进程/线程(这种情况比较少见)

如果需要和发起新的连接请求的客户端建立连接,那么就必须在服务器端通过一个循环调用accept()函数,另外已经和服务器建立连接的客户端需要和服务器通信发送数据时的阻塞可以忽略当接收不到数据时程序也会被阻塞,这时候就会非常矛盾,被accept()阻塞就无法通信被read()阻塞就无法和客户端建立新连接

基于上述处理方式,在单线程/单进程场景下,服务器是无法处理多连接的,解决方案常用的有三种:

  1. 使用多线程实现
  2. 使用多进程实现
  3. 使用IO多路转接(复用)实现
  4. 使用IO多路转接 + 多线程实现

2. 多进程并发

如果要编写多进程版的并发服务器程序,首先要考虑,创建出的多个进程都是什么角色,这样就可以在程序中对号入座了。在Tcp服务器端一共有两个角色,分别是:监听和通信监听是一个持续的动作如果有新连接就建立连接,如果没有新连接就阻塞。关于通信是需要和多个客户端同时进行的,因此需要多个进程,这样才能达到互不影响的效果。进程也有两大类:父进程和子进程,通过分析我们可以这样分配进程:

任务分配

  • 父进程的任务:
    • 负责监听,处理客户端的连接请求,也就是在父进程中循环调用accept()函数
    • 创建子进程建立一个新的连接,就创建一个新的子进程,让这个子进程和对应的客户端通信
    • 回收子进程资源:子进程退出回收其内核PCB资源,防止出现僵尸进程
  • 子进程:负责通信,基于父进程建立新连接之后得到的文件描述符,和对应的客户端完成数据的接收和发送。
    • 发送数据:send() / write()
    • 接收数据:recv() / read()

在多进程版的服务器端程序中,多个进程是有血缘关系,对应有血缘关系的进程来说,还需要想明白他们有哪些资源是可以被继承的,哪些资源是独占的,以及一些其他细节:

有血缘关系的进程有哪些资源是可以被继承的,哪些资源是独占的?

  • 子进程是父进程的拷贝,在子进程的内核区PCB中,文件描述符也是可以被拷贝的,因此在父进程可以使用的文件描述符在子进程中也有一份,并且可以使用它们做和父进程一样的事情。
  • 父子进程有用各自的独立的虚拟地址空间,因此所有的资源都是独占的
  • 为了节省系统资源,对于只有在父进程才能用到的资源,可以在子进程中将其释放掉父进程亦如此
  • 由于需要在父进程中做accept()操作并且要释放子进程资源,如果想要更高效一下可以使用信号的方式处理

多进程版并发TCP服务器示例代码如下:

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

// 信号处理函数
void callback(int num)
{
    while(1)
    {
        pid_t pid = waitpid(-1, NULL, WNOHANG);
        // -1 代表任意子进程
        // NULL 表示不关心子进程的退出状态
        // WNOHANG 表示非阻塞调用
        if(pid <= 0)
        {
            printf("子进程正在运行, 或者子进程被回收完毕了
");
            break;
        }
        printf("child die, pid = %d
", pid);
    }
}
int childWork(int cfd);
int main()
{
    // 1. 创建监听的套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1)
    {
        perror("socket");
        exit(0);
    }int

    // 2. 将socket()返回值和本地的IP端口绑定到一起
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(10000);   // 大端端口
    // INADDR_ANY代表本机的所有IP, 假设有三个网卡就有三个IP地址
    // 这个宏可以代表任意一个IP地址
    // 这个宏一般用于本地的绑定操作
    addr.sin_addr.s_addr = INADDR_ANY;  // 这个宏的值为0 == 0.0.0.0
    //    inet_pton(AF_INET, "192.168.237.131", &addr.sin_addr.s_addr);
    int ret = bind(lfd, (struct sockaddr*)&addr, sizeof(addr));
    //将 lfd 绑定到 `addr` 指定的本地 IP 和端口
    if(ret == -1)
    {
        perror("bind");
        exit(0);
    }

    // 3. 设置监听
    ret = listen(lfd, 128);
    if(ret == -1)
    {
        perror("listen");
        exit(0);
    }

    // 注册信号的捕捉
    struct sigaction act;
    act.sa_flags = 0;
    act.sa_handler = callback;
    sigemptyset(&act.sa_mask);// 初始化信号集为“空”
    sigaction(SIGCHLD, &act, NULL);//只屏蔽子进程退出信号SIGCHLD
    // 接受多个客户端连接, 对需要循环调用 accept
    while(1)
    {
        // 4. 阻塞等待并接受客户端连接
        struct sockaddr_in cliaddr;
        int clilen = sizeof(cliaddr);
        //建立服务器和客户端的连接
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);
        if(cfd == -1)
        {
            if(errno == EINTR)
            {
                // accept调用被信号中断了, 解除阻塞, 返回了-1
                //EINTR是errno的一个取值,表示:系统调用被信号中断。
                // 重新调用一次accept
                continue;
            }
            perror("accept");
            exit(0);
 
        }
        // 打印客户端的地址信息
        char ip[24] = {0};
        //二进制的网络地址(数值型)转成字符串形式的 IP 地址
        printf("客户端的IP地址: %s, 端口: %d
",
               inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ip, sizeof(ip)),
               ntohs(cliaddr.sin_port));
        // 新的连接已经建立了, 创建子进程, 让子进程和这个客户端通信
        pid_t pid = fork();
        if(pid == 0)
        {
            // 子进程 -> 和客户端通信
            // 通信的文件描述符cfd被拷贝到子进程中
            // 子进程不负责监听
            close(lfd);
            while(1)
            {
                int ret = childWork(cfd);
                if(ret <=0)
                {
                    break;
                }
            }
            // 退出子进程
            close(cfd);
            exit(0);
        }
        else if(pid > 0)
        {
            // 父进程不和客户端通信
            //关闭服务器和客户端的连接的套接字
            close(cfd);
        }
        esle
        {
	        perror("fork");
        }
    }
    return 0;
}


// 5. 和客户端通信
int childWork(int cfd)
{

    // 接收数据
    char buf[1024];
    memset(buf, 0, sizeof(buf));
    //从cfd中读取数据到bbuf
    int len = read(cfd, buf, sizeof(buf));
    if(len > 0)
    {
        printf("客户端say: %s
", buf);
        //回显功能:客户端发送什么,服务器就回复什么。
        write(cfd, buf, len);
    }
    else if(len  == 0)
    {
        printf("客户端断开了连接...
");
    }
    else
    {
        perror("read");
    }

    return len;
}

在上面的示例代码中,父子进程中分别关掉了用不到的文件描述符(父进程不需要通信,子进程也不需要监听)。如果客户端主动断开连接,那么服务器端负责和客户端通信的子进程也就退出了,子进程退出之后会给父进程发送一个叫做SIGCHLD的信号,在父进程中通过sigaction()函数捕捉了该信号,通过回调函数callback()中的waitpid()对退出的子进程进行了资源回收。

另外还有一个细节要说明一下,这是父进程的处理代码:

int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);
while(1)
{
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);
        if(cfd == -1)
        {
            if(errno == EINTR)
            {
                // accept调用被信号中断了, 解除阻塞, 返回了-1
                // 重新调用一次accept
                continue;
            }
            perror("accept");
            exit(0);
        }
 }

如果父进程调用accept() 函数没有检测到新的客户端连接,父进程就阻塞在这儿了,这时候有子进程退出了,发送信号给父进程,父进程就捕捉到了这个信号SIGCHLD, 由于信号的优先级很高,会打断代码正常的执行流程,因此父进程的阻塞被中断,转而去处理这个信号对应的函数callback(),处理完毕,再次回到accept()位置,但是这是已经无法阻塞了,函数直接返回-1,此时函数调用失败,错误描述为accept: Interrupted system call,对应的错误号为EINTR,由于代码是被信号中断导致的错误,所以可以在程序中对这个错误号进行判断,让父进程重新调用accept(),继续阻塞或者接受客户端的新连接。

3. 多线程并发

编写多线程版的并发服务器程序和多进程思路差不多,考虑明白了对号入座即可。多线程中的线程有两大类:主线程(父线程)和子线程,他们分别要在服务器端处理监听和通信流程。根据多进程的处理思路,就可以这样设计了:

多线程并发

  • 主线程
    • 负责监听处理客户端的连接请求,也就是在父进程中循环调用accept()函数
    • 创建子线程建立一个新的连接,就创建一个新的子进程,让这个子进程和对应的客户端通信
    • 回收子线程资源:由于回收需要调用阻塞函数,这样就会影响accept(),直接做线程分离即可
  • 子线程负责通信基于主线程建立新连接之后得到的文件描述符,和对应的客户端完成数据的接收和发送。
    发送数据:send() / write()
    - 接收数据:recv() / read()
    在多线程版的服务器端程序中,多个线程共用同一个地址空间,有些数据是共享的,有些数据的独占的,下面来分析一些其中的一些细节:
  • 同一地址空间中的多个线程的栈空间是独占的
  • 多个线程共享全局数据区,堆区,以及内核区的文件描述符等资源,因此需要注意数据覆盖问题,并且在多个线程访问共享资源的时候,还需要进行线程同步。


多线程版Tcp服务器示例代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
struct SockInfo
{
    int fd;                      // 通信
    pthread_t tid;               // 线程ID
    struct sockaddr_in addr;     // 地址信息
};
struct SockInfo infos[128];
void* working(void* arg)
{
    while(1)
    {
        struct SockInfo* info = (struct SockInfo*)arg;
        // 接收数据
        char buf[1024];
        int ret = read(info->fd, buf, sizeof(buf));
        if(ret == 0)
        {
            printf("客户端已经关闭连接...
");
            info->fd = -1;
            break;
        }
        else if(ret == -1)
        {
            printf("接收数据失败...
");
            info->fd = -1;
            break;
        }
        else
        {
            write(info->fd, buf, strlen(buf)+1);
        }
    }
    return NULL;
}
int main()
{
    // 1. 创建用于监听的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd == -1)
    {
        perror("socket");
        exit(0);
    }
    // 2. 绑定
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;          // ipv4
    addr.sin_port = htons(8989);        // 字节序应该是网络字节序
    addr.sin_addr.s_addr = INADDR_ANY; // == 0, 获取IP的操作交给了内核
    int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret == -1)
    {
        perror("bind");
        exit(0);
    }

    // 3.设置监听
    ret = listen(fd, 100);
    if(ret == -1)
    {
        perror("listen");
        exit(0);
    }
    // 4. 等待, 接受连接请求
    int len = sizeof(struct sockaddr);
    // 数据初始化 定义max个infos结构体
    int max = sizeof(infos) / sizeof(infos[0]);
    for(int i=0; iaddr, &len);
        printf("parent thread, connfd: %d
", connfd);
        if(connfd == -1)
        {
            perror("accept");
            exit(0);
        }
        pinfo->fd = connfd;
        pthread_create(&pinfo->tid, NULL, working, pinfo);
        pthread_detach(pinfo->tid);
//将线程设置为分离状态。
//分离状态下,线程结束后系统会自动回收它的资源,不需要父线程等待线程结束。
//调用 `pthread_join` 会使调用线程阻塞,直到目标线程结束。
    }
    // 释放资源
    close(fd);  // 监听
    return 0;
}

在编写多线程版并发服务器代码的时候,需要注意父子线程共用同一个地址空间中的文件描述符,因此每当在主线程中建立一个新的连接,都需要将得到文件描述符值保存起来,不能在同一变量上进行覆盖,这样做丢失了之前的文件描述符值也就不知道怎么和客户端通信了。

上面代码将成功建立连接之后得到的用于通信的文件描述符值保存到了一个全局数组中每个子线程需要和不同的客户端通信,需要的文件描述符值也就不一样,只要保证存储每个有效文件描述符值的变量对应不同的内存地址,在使用的时候就不会发生数据覆盖的现象,造成通信数据的混乱。

本文地址:https://www.vps345.com/8773.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge 英语 docker java 容器 ubuntu ssh nginx 负载均衡 进程 操作系统 进程控制 Ubuntu deepseek Ollama 模型联网 API CherryStudio 网络 php 人工智能 macos windows conda python MCP 数据库 centos oracle 关系型 安全 分布式 神经网络 深度学习 计算机视觉 卷积神经网络 开发环境 笔记 经验分享 阿里云 网络安全 网络协议 llama 算法 opencv 自然语言处理 语言模型 C# MQTTS 双向认证 emqx json c++ 并查集 leetcode mysql 机器学习 RTSP xop RTP RTSPServer 推流 视频 环境变量 adb android 科技 ai 个人开发 tcp/ip debian PVE react.js 前端面试题 node.js 持续部署 Dify harmonyos 华为 开发语言 typescript 计算机网络 学习 高级IO epoll 学习方法 大数据 spark hive jenkins gitee spring boot 数据分析 tomcat fstab vscode asm jellyfin nas ip协议 openvpn server openvpn配置教程 centos安装openvpn kafka AI大模型 大模型技术 本地部署大模型 java-ee elasticsearch dify ollama 私有化 本地部署 聚类 鸿蒙 开源 github 实时音视频 实时互动 Alexnet EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 物联网 mcu iot 信息与通信 windows 服务器安装 单片机 架构 云原生 etcd 数据安全 RBAC 运维开发 HarmonyOS Next websocket c# cron crontab日志 创意 社区 DevEco Studio 媒体 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn 面试 性能优化 jdk intellij-idea MacOS录屏软件 虚拟机 VMware pycharm ide 互信 eureka YOLO xcode 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 Dell R750XS rust http Qwen2.5-coder 离线部署 思科 嵌入式 linux驱动开发 arm开发 嵌入式硬件 集成学习 集成测试 gnu pip Linux 进程信号 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 计算机外设 电脑 mac 软件需求 uni-app ui 华为云 华为od 后端 k8s kubernetes 自动化 spring 数据结构 c语言 链表 pytorch vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 ue5 vr sublime text 编辑器 ip命令 新增网卡 新增IP 启动网卡 多线程 ssl 前端框架 目标检测 burp suite 抓包 vnc Docker Hub docker pull 镜像源 daemon.json fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse rabbitmq qt QT 5.12.12 QT开发环境 Ubuntu18.04 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 efficientVIT YOLOv8替换主干网络 TOLOv8 unix filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 redis matplotlib fonts-noto-cjk 智能路由器 外网访问 内网穿透 端口映射 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 protobuf 序列化和反序列化 安装 maxkb ARG 网络药理学 生信 生物信息学 gromacs 分子动力学模拟 MD 动力学模拟 llm transformer git 游戏程序 ios 程序员创富 nlp gcc centos 7 ip 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 powerpoint vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 numpy 产品经理 agi microsoft vim spring cloud DeepSeek-R1 API接口 linux上传下载 dubbo live555 rtsp rtp 远程控制 远程看看 远程协助 perf linux内核 无人机 Linux PID jar gradle 机器人 安卓模拟器 硬件工程 flutter ESP32 camera Arduino 电子信息 Hyper-V WinRM TrustedHosts 命令 Ubuntu Server Ubuntu 22.04.5 iperf3 带宽测试 KylinV10 麒麟操作系统 Vmware 串口服务器 flask AI编程 AIGC maven 虚拟局域网 udp 本地环回 bind postgresql visual studio code compose DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 apache 政务 分布式系统 监控运维 Prometheus Grafana iBMC UltraISO web安全 Kali Linux 黑客 渗透测试 信息收集 docker compose tcpdump 系统架构 微服务 设计模式 软件工程 golang mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 DeepSeek 压测 ECS rocketmq 域名服务 DHCP 符号链接 配置 深度求索 私域 知识库 课程设计 主从复制 交互 腾讯云大模型知识引擎 Deepseek iftop 网络流量监控 AI Agent Deepseek-R1 大模型 私有化部署 推理模型 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 云原生开发 K8S k8s管理系统 报错 cpu 内存 实时 使用 开发 文件系统 路径解析 docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos gitlab dell服务器 go 代理模式 Reactor C++ 向日葵 虚拟现实 区块链 JAVA Java ipython YOLOv12 C语言 1024程序员节 chatgpt gpu算力 YOLOv8 NPU Atlas800 A300I pro asi_bench ubuntu20.04 ros ros1 Noetic 20.04 apt 安装 milvus Chatbox 迁移指南 UOS 统信操作系统 yum ffmpeg 音视频 firewalld 读写锁 bcompare Beyond Compare mybatis 远程工作 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 统信UOS 麒麟 bonding 链路聚合 cuda llama3 Chatglm 开源大模型 腾讯云 windows日志 unity ping++ ESXi ddos stm32项目 stm32 目标跟踪 OpenVINO 推理应用 linux安装配置 kali 共享文件夹 Samba NAS rag ragflow ragflow 源码启动 list 模拟实现 zotero WebDAV 同步失败 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer virtualenv ue4 着色器 虚幻 mongodb 客户端 温湿度数据上传到服务器 Arduino HTTP cudnn anaconda springcloud 工业4.0 安卓 threejs 3D 中兴光猫 换光猫 网络桥接 自己换光猫 鸿蒙系统 ansible playbook 剧本 网易邮箱大师 监控 自动化运维 kylin OpenManus DNS fpga开发 prometheus grafana sql KingBase CLion 远程连接 IDE 博客 指令 html CPU 主板 电源 网卡 bash oceanbase rc.local 开机自启 systemd Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 ollama下载加速 银河麒麟 kylin v10 麒麟 v10 设置代理 实用教程 深度优先 图论 并集查找 换根法 树上倍增 智能手机 Termux express p2p 权限 postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 微信 微信分享 Image wxopensdk .netcore tar 键盘 WebUI DeepSeek V3 安防软件 隐藏文件 隐藏目录 管理器 通配符 IIS服务器 IIS性能 日志监控 log4j intellij idea minicom 串口调试工具 测试工具 fd 文件描述符 飞牛nas fnos 云桌面 微软 AD域控 证书服务器 svn rpc windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 mq .net selenium 低代码 sqlserver WSL2 Ubuntu22.04 虚拟化 开发人员主页 AI写作 Linux的权限 flash-attention NFS 监控k8s 监控kubernetes 命名管道 客户端与服务端通信 WSL2 上安装 Ubuntu arm WLAN 豆瓣 追剧助手 迅雷 vSphere vCenter 软件定义数据中心 sddc 爬虫 数据集 LDAP aws googlecloud MQTT协议 消息服务器 代码 远程 执行 sshpass 操作 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 AI-native gpt LLM CrewAI jmeter 软件测试 edge浏览器 HCIE 数通 rime 进程优先级 调度队列 进程切换 bug 基础环境 burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 webstorm docker-compose gateway Clion Nova ResharperC++引擎 Centos7 远程开发 缓存 pillow 强制清理 强制删除 mac废纸篓 html5 firefox 监控k8s集群 集群内prometheus kamailio sip VoIP 大数据平台 系统安全 C 进程地址空间 5G 3GPP 卫星通信 xml ssh漏洞 ssh9.9p2 CVE-2025-23419 WSL win11 无法解析服务器的名称或地址 RAGFLOW database vmware 卡死 Cline 自动化编程 https rust腐蚀 openwrt ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 selete alias unalias 别名 ros2 moveit 机器人运动 rancher 程序人生 僵尸进程 VMware创建虚拟机 环境配置 通信工程 毕业 wireshark 显示过滤器 ICMP Wireshark安装 VMware安装mocOS macOS系统安装 VMware安装Ubuntu Ubuntu安装k8s 网络工程师 网络管理 软考 2024 2024年上半年 下午真题 答案 linux环境变量 ux 视觉检测 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 Ubuntu共享文件夹 共享目录 Linux共享文件夹 Windsurf 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 Hive环境搭建 hive3环境 Hive远程模式 代码调试 ipdb 中间件 iis 多线程服务器 Linux网络编程 FTP 服务器 源码剖析 rtsp实现步骤 流媒体开发 系统开发 binder 车载系统 framework 源码环境 nftables 防火墙 Anolis nginx安装 环境安装 linux插件下载 本地部署AI大模型 nac 802.1 portal 健康医疗 互联网医院 双系统 GRUB引导 Linux技巧 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 shell TRAE visualstudio 银河麒麟操作系统 国产化 程序员 Playwright 自动化测试 MySql nfs 服务器部署ai模型 P2P HDLC 部署 SSL 域名 Typore rsyslog 飞牛NAS 飞牛OS MacBook Pro 图像处理 3d harmonyOS面试题 cnn 三级等保 服务器审计日志备份 邮件APP 免费软件 技能大赛 Trae AI 原生集成开发环境 Trae AI 程序 编程 性能分析 驱动开发 嵌入式实习 RAID RAID技术 磁盘 存储 ecmascript nextjs react reactjs ceph nvm 黑客技术 AI代码编辑器 流式接口 URL CentOS Stream CentOS lb 协议 api 单例模式 banner wsl xfce ci/cd 联想开天P90Z装win10 excel Kylin-Server 国产操作系统 服务器安装 搜索引擎 idm 网络结构图 yaml Ultralytics 可视化 matlab 企业微信 Linux24.04 deepin devops EasyConnect bootstrap zabbix 交叉编译 树莓派 VNC hadoop gpt-3 文心一言 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 网工 7z webrtc ssrf 失效的访问控制 其他 kernel 小智 显卡驱动 Web服务器 多线程下载工具 网络编程 PYTHON 压力测试 蓝桥杯 OpenSSH elk make命令 makefile文件 序列化反序列化 jina IPv4 子网掩码 公网IP 私有IP SSH 密钥生成 SSH 公钥 私钥 生成 HarmonyOS xrdp 远程桌面 金融 seatunnel string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap SSL证书 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 Web应用服务器 群晖 飞牛 Redis Desktop composer 镜像 odoo 服务器动作 Server action NPS 雨云服务器 雨云 产测工具框架 IMX6ULL 管理框架 能力提升 面试宝典 技术 IT信息化 环境迁移 ebpf uprobe 游戏引擎 Linux的基础指令 ROS2 thingsboard 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 毕设 rclone AList webdav fnOS npm mariadb 相差8小时 UTC 时间 联网 easyconnect 代理 mamba Vmamba netty 代码托管服务 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 ROS 自动驾驶 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 IIS .net core Hosting Bundle .NET Framework vs2022 微信小程序 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 直播推流 lio-sam SLAM uv 宝塔面板无法访问 开机黑屏 状态管理的 UDP 服务器 Arduino RTOS django openEuler jvm gitea 微信公众平台 risc-v Carla 智能驾驶 宝塔 软件构建 多进程 HiCar CarLife+ CarPlay QT RK3588 yolov8 计算机 jupyter Node-Red 编程工具 流编程 safari Mac 系统 CH340 串口驱动 CH341 uart 485 css wps web 历史版本 下载 Invalid Host allowedHosts vue etl ubuntu24.04.1 RAG 检索增强生成 文档解析 大模型垂直应用 Wi-Fi 自学笔记 小米 澎湃OS Android c/c++ 串口 Socket centos-root /dev/mapper yum clean all df -h / du -sh 职场和发展 医疗APP开发 app开发 执法记录仪 智能安全帽 smarteye n8n 工作流 workflow pdf 图片增强 增强数据 llama.cpp SysBench 基准测试 samba 服务器时间 minio 大语言模型 模拟器 教程 nvidia rnn Dell HPE 联想 浪潮 云电竞 云电脑 todesk 宕机切换 服务器宕机 可信计算技术 安全架构 网络攻击模型 安全威胁分析 fast KVM arcgis 数学建模 计算生物学 生物信息 基因组 MCP server C/S asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 游戏服务器 Minecraft DOIT 四博智联 Cookie iDRAC R720xd ShenTong DBeaver freebsd 开机自启动 矩阵 用户缓冲区 prompt easyui langchain 服务器管理 宝塔面板 配置教程 网站管理 k8s二次开发 集群管理 支付 微信支付 开放平台 国产数据库 瀚高数据库 数据迁移 下载安装 pyautogui onlyoffice SenseVoice 磁盘监控 top Linux top top命令详解 top命令重点 top常用参数 ruoyi 服务器配置 QQ 聊天室 统信 UOS1070e yum源切换 更换国内yum源 bot Docker ocr 硬件架构 线程 cocoapods 代码规范 XFS xfs文件系统损坏 I_O error okhttp 测试用例 功能测试 微信开放平台 微信公众号配置 file server http server web server 远程登录 telnet 版本 DeepSeek r1 Open WebUI 灵办AI muduo kvm cd 目录切换 X11 Xming 浏览器自动化 Kali 渗透 单元测试 网站搭建 serv00 FunASR ASR miniapp 真机调试 调试 debug 断点 网络API请求调试方法 apt 国内源 DIFY Docker Desktop 图形化界面 换源 Debian tensorflow visual studio rdp 实验 eclipse 热榜 王者荣耀 NLP模型 NLP 策略模式 yolov5 GCC crosstool-ng bat 交换机 硬件 设备 GPU PCI-Express 服务器繁忙 trea idea jetty undertow grub 版本升级 扩容 跨域 毕昇JDK wsl2 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 trae 办公自动化 自动化生成 pdf教程 xpath定位元素 curl wget MNN Qwen 多层架构 解耦 springboot IO 大模型部署 vu大文件秒传跨域报错cors SSH linux 命令 sed 命令 半虚拟化 硬件虚拟化 Hypervisor notepad Erlang OTP gen_server 热代码交换 事务语义 田俊楠 自动化任务管理 游戏机 hugo 命令行 基础入门 Netty 即时通信 NIO 软链接 硬链接 SWAT 配置文件 服务管理 网络共享 gaussdb pgpool SSH 服务 SSH Server OpenSSH Server 分析解读 DeepSeek行业应用 Heroku 网站部署 GameFramework HybridCLR Unity编辑器扩展 自动化工具 端口测试 Qualcomm WoS Python QNN AppBuilder AI作画 next.js 部署next.js 信号 outlook micropython esp32 mqtt 机柜 1U 2U android studio 思科模拟器 Cisco nuxt3 推荐算法 蓝耘科技 元生代平台工作流 ComfyUI 嵌入式系统开发 小艺 Pura X 跨平台 TrueLicense Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 W5500 OLED u8g2 TCP服务器 银河麒麟服务器操作系统 系统激活 redhat r语言 数据可视化 MacMini 迷你主机 mini Apple 宠物 毕业设计 免费学习 宠物领养 宠物平台 算力 智慧农业 开源鸿蒙 团队开发 Jellyfin 磁盘清理 Xinference RAGFlow tcp 社交电子 数据库系统 ubuntu24 vivado24 React Next.js 开源框架 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 conda配置 conda镜像源 hibernate 云耀服务器 免费域名 域名解析 rustdesk docker命令大全 DocFlow Linux权限 权限命令 特殊权限 VR手套 数据手套 动捕手套 动捕数据手套 同步 备份 建站 MAC SecureCRT k8s集群资源管理 vscode 1.86 大模型入门 大模型教程 鲲鹏 昇腾 npu 直流充电桩 充电桩 IPMI x64 SIGSEGV SSE xmm0 frp 稳定性 看门狗 边缘计算 SEO OD机试真题 华为OD机试真题 服务器能耗统计 chfs ubuntu 16.04 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 漏洞 显示管理器 lightdm gdm kind unity3d Helm k8s集群 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 网络穿透 云服务器 火绒安全 axure 富文本编辑器 Nuxt.js Xterminal 输入法 HP Anyware 智能音箱 智能家居 av1 电视盒子 机顶盒ROM 魔百盒刷机 vpn 弹性计算 裸金属服务器 弹性裸金属服务器 pygame 实习 致远OA OA服务器 服务器磁盘扩容 neo4j 数据仓库 数据库开发 ArkTs ArkUI c CORS 大模型面经 大模型学习 AnythingLLM AnythingLLM安装 飞书 zip unzip XCC Lenovo dns uniapp 繁忙 解决办法 替代网站 汇总推荐 AI推理 恒源云 powerbi 信息可视化 keepalived sonoma 自动更新 dba embedding ELF加载 AutoDL oneapi qemu libvirt 大模型微调 chrome devtools chromedriver 话题通信 服务通信 skynet WebVM IM即时通讯 剪切板对通 HTML FORMAT 网络爬虫 流水线 脚本式流水线 saltstack ArcTS 登录 ArcUI GridItem arkUI Linux 维护模式 Mac内存不够用怎么办 LORA sqlite 华为认证 MS Materials openssl 密码学 业界资讯 模拟退火算法 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 code-server MQTT mosquitto 消息队列 Zoertier 内网组网 Cursor 金仓数据库 2025 征文 数据库平替用金仓 信号处理 oracle fusion oracle中间件 AISphereButler 华为证书 HarmonyOS认证 华为证书考试 java-rabbitmq 硅基流动 ChatBox ssh远程登录 virtualbox echarts 网页设计 OpenHarmony CosyVoice 镜像下载 fork wait waitpid exit sdkman su sudo Java Applet URL操作 服务器建立 Socket编程 网络文件读取 Ark-TS语言 less remote-ssh TCP WebServer docker run 数据卷挂载 交互模式 ukui 麒麟kylinos openeuler 图形渲染 虚拟机安装 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? Google pay Apple pay 框架搭建 小游戏 五子棋 视频编解码 RustDesk自建服务器 rustdesk服务器 docker rustdesk 相机 lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 web3.py scikit-learn VPS pyqt 工具 强化学习 虚拟显示器 cmos 混合开发 JDK RTMP 应用层 db big data 重启 排查 系统重启 日志 原因 opensearch helm dity make 服务器主板 AI芯片 eNSP 网络规划 VLAN 企业网络 python2 ubuntu24.04 MI300x 孤岛惊魂4 WebRTC mysql离线安装 ubuntu22.04 mysql8.0 源码 kotlin iphone 网页服务器 web服务器 Nginx k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 聊天服务器 套接字 实战案例 searxng 服务器扩容没有扩容成功 考研 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 IPMITOOL BMC 硬件管理 在线office opcua opcda KEPServer安装 export import save load 迁移镜像 京东云 open webui sqlite3 HarmonyOS NEXT 原生鸿蒙 TrinityCore 魔兽世界 adobe 传统数据库升级 银行 LLMs asp.net大文件上传下载 VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 文件分享 VSCode can 线程池 移动云 视频平台 录像 视频转发 性能测试 视频流 云服务 智能电视 springsecurity6 oauth2 授权服务器 token sas firewall 崖山数据库 YashanDB ruby cfssl Docker Compose Ubuntu 24.04.1 轻量级服务器 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 拓扑图 LInux 错误代码2603 无网络连接 2603 Reactor反应堆 clickhouse 僵尸世界大战 游戏服务器搭建 iNode Macos Logstash 日志采集 zookeeper Windows USB转串口 MVS 海康威视相机 react native 项目部署 ai工具 v10 软件 ldap IDEA ubuntu 18.04 GIS 遥感 WebGIS 网络文件系统 移动魔百盒 服务器部署 本地拉取打包 nosql lvm 磁盘挂载 磁盘分区 Linux环境 aarch64 编译安装 HPC 架构与原理 perl deepseak 豆包 KIMI 腾讯元宝 dock 加速 CNNs 图像分类 欧标 OCPP 多个客户端访问 IO多路复用 回显服务器 TCP相关API 内网环境 lua 网卡的名称修改 eth0 ens33 浪潮信息 AI服务器 triton 模型分析 deepseek r1 whistle 大模型应用 音乐库 容器技术 ArkTS 移动端开发 匿名管道 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 SRS 流媒体 直播 NAT转发 NAT Server Unity Dedicated Server Host Client 无头主机 diskgenius glibc MDK 嵌入式开发工具 论文笔记 计算机科学与技术 底层实现 常用命令 文本命令 目录命令 python3.11 seleium dash 正则表达式 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 端口聚合 windows11 midjourney Qwen2.5-VL vllm navicat 达梦 DM8 WINCC Mac软件 远程过程调用 Windows环境 技术共享 sentinel es 对比 meld DiffMerge 佛山戴尔服务器维修 佛山三水服务器维修 Attention swoole FTP服务器 vite 大屏端 System V共享内存 进程通信 无桌面 软件卸载 系统清理 EVE-NG shell脚本免交互 expect linux免交互 软负载 我的世界 我的世界联机 数码 docker desktop image 我的世界服务器搭建 加解密 Yakit yaklang 生活 干货分享 黑客工具 密码爆破 IO模型 端口 查看 ss 沙盒 deployment daemonset statefulset cronjob tailscale derp derper 中转 线性代数 电商平台 ecm bpm C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 stable diffusion win服务器架设 windows server cursor 音乐服务器 Navidrome 音流 g++ g++13 word H3C mcp服务器 client close 状态模式 嵌入式Linux IPC 运维监控 rpa EMUI 回退 降级 升级 PX4 IMX317 MIPI H265 VCU VS Code 前后端分离 多端开发 智慧分发 应用生态 鸿蒙OS Linux find grep 钉钉 DevOps 软件交付 数据驱动 应用场景 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 Docker快速入门 yashandb Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 语法 AzureDataStudio 个人博客 hexo 小智AI服务端 xiaozhi TTS uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 抓包工具 AD 域管理 Spring Security minecraft 元服务 应用上架 计算虚拟化 弹性裸金属 qt5 客户端开发 网络建设与运维 阻塞队列 生产者消费者模型 服务器崩坏原因 李心怡 iTerm2 ISO镜像作为本地源 游戏开发 ranger MySQL8.0 docker部署Python 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 deekseek docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 离线部署dify 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 企业网络规划 华为eNSP k8s部署 MySQL8.0 高可用集群(1主2从) pppoe radius HTTP 服务器控制 ESP32 DeepSeek dns是什么 如何设置电脑dns dns应该如何设置 银河麒麟桌面操作系统 Kylin OS xss 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 本地化部署 分布式训练 代理服务器 AI agent vasp安装 qt项目 qt项目实战 qt教程 opengl 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP mysql安装报错 windows拒绝安装 Radius EMQX 通信协议 银河麒麟高级服务器 外接硬盘 Kylin MobaXterm 文件传输 物联网开发 根服务器 超融合 glm4 远程服务 laravel junit 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 Isaac Sim 虚拟仿真 语音识别 查看显卡进程 fuser ArtTS Python基础 Python教程 Python技巧 内网服务器 内网代理 内网通信 UEFI Legacy MBR GPT U盘安装操作系统 deep learning 北亚数据恢复 oracle数据恢复 需求分析 规格说明书 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 影刀 #影刀RPA# es6 qt6.3 g726 反向代理 xshell termius iterm2 Claude Mermaid 可视化图表 笔灵AI AI工具 MacOS ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口服务器 CDN 备选 网站 调用 示例 AD域 查询数据库服务IP地址 SQL Server DenseNet 开源软件 figma 服务网格 istio wpf 合成模型 扩散模型 图像生成 cmake GoogLeNet scapy 电视剧收视率分析与可视化平台 Headless Linux 阿里云ECS 增强现实 沉浸式体验 技术实现 案例分析 AR 问题解决 鸿蒙开发 移动开发 USB网络共享 自定义客户端 SAS 虚幻引擎 wsgiref Web 服务器网关接口 flink 华为机试 浏览器开发 AI浏览器 大大通 第三代半导体 碳化硅 UDP的API使用 sequoiaDB java-rocketmq 做raid 装系统 armbian u-boot 负载测试 捆绑 链接 谷歌浏览器 youtube google gmail Sealos hosts 论文阅读 MAVROS 四旋翼无人机 黑苹果 性能调优 安全代理 本地知识库部署 DeepSeek R1 模型 prometheus数据采集 prometheus数据模型 prometheus特点 项目部署到linux服务器 项目部署过程 ftp CVE-2024-7347 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 proxy模式 烟花代码 烟花 元旦 h.264 LLM Web APP Streamlit regedit 开机启动 vmamba AI员工 免密 公钥 私钥 cpp-httplib tidb GLIBC 网络搭建 神州数码 神州数码云平台 云平台 web3 copilot Apache Beam 批流统一 案例展示 数据分区 容错机制 vscode1.86 1.86版本 ssh远程连接 open Euler dde csrutil mac恢复模式进入方法 恢复模式 单一职责原则 信创 信创终端 中科方德 PPI String Cytoscape CytoHubba 内核 搭建个人相关服务器 人工智能生成内容 IMM netlink libnl3 kerberos sudo原理 su切换 sysctl.conf vm.nr_hugepages webgl 安装MySQL 多路转接 知识图谱 玩机技巧 软件分享 软件图标 授时服务 北斗授时 openstack Xen 高效I/O HistoryServer Spark YARN jobhistory TCP协议 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 极限编程 抗锯齿 多产物 工具分享 一切皆文件 lighttpd安装 Ubuntu配置 Windows安装 服务器优化 CPU 使用率 系统监控工具 linux 命令 服务器正确解析请求体 桌面环境 粘包问题 玩游戏 弹性服务器 macOS css3 archlinux kde plasma beautifulsoup 服务器ssl异常解决 配置原理 UDP Pyppeteer 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 流量运营 AI Agent 字节智能运维 华为OD 可以组成网络的服务器 接口优化 WireGuard 异地组网 搜狗输入法 中文输入法 Unity插件 iventoy VmWare OpenEuler 解决方案 端口号 开放端口 访问列表 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 gunicorn js 充电桩平台 充电桩开源平台 带外管理 大模型推理 zerotier 管道 锁屏不生效 NFC 近场通讯 智能门锁 ABAP 风扇控制软件 ftp服务 文件上传 GeneCards OMIM TTD 存储维护 NetApp存储 EMC存储 桌面快捷方式 SVN Server tortoise svn retry 重试机制 HAProxy pyicu 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 env 变量 西门子PLC 通讯 fiddler 联机 僵尸毁灭工程 游戏联机 开服 ShapeFile GeoJSON Ardupilot 环境搭建 Maven 零售 deepseek-r1 大模型本地部署 yum换源 Office VGG网络 卷积层 池化层 autodl 数字证书 签署证书 内网渗透 靶机渗透 ufw 日志分析 系统取证 initramfs Linux内核 Grub VPN wireguard 蓝桥杯C++组 动静态库 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 ardunio BLE 蓝牙 进程间通信 nohup后台启动 Linux Vim ajax 显示器 solidworks安装 输入系统 openjdk 电路仿真 multisim 硬件工程师 硬件工程师学习 电路图 电路分析 仪器仪表 umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 ueditor导入word ueditor导入pdf ueditor导入ppt nacos chromium dpi linuxdeployqt 打包部署程序 appimagetool 网络原理 大模型训练/推理 推理问题 mindie IP配置 netplan 智能体开发 终端工具 远程工具 Xshell 安全漏洞 信息安全 llamafactory 微调 内存管理 显卡驱动持久化 GPU持久化 动态规划 用户管理 打不开xxx软件 无法检查其是否包含恶意软件 IPv6 IPv6测试 IPv6测速 IPv6检测 IPv6查询 分子对接 autodock mgltools PDB PubChem autoware 分布式账本 智能合约 信任链 共识算法 ollama api ollama外网访问 LVM lvresize 磁盘扩容 pvcreate SystemV qps 高并发 大版本升 升级Ubuntu系统 全文检索 图搜索算法 sublime text3 massa sui aptos sei 空间 查错 实时内核 行情服务器 股票交易 速度慢 切换 股票量化接口 股票API接口 终端 ubuntu安装 linux入门小白 7-zip 区块链项目 servlet 哈希算法 Bug解决 Qt platform OpenCV 程序化交易 量化交易 高频交易 机械臂 免费 c/s 跨域请求 软件开发 源代码管理 考试 AimRT 脚本 PyQt PySide6 券商 股票交易接口api 类型 特点 金仓数据库概述 金仓数据库的产品优化提案