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

TCP服务器与客户端搭建

一、思维导图

二、给代码添加链表

        【server.c】

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;enum Type{TYPE_REGIST,TYPE_LOGIN
};typedef struct Pack{int size;enum Type type;char buf[2048];int count;
}pack_t;/*
typedef struct user_info{union Data{struct user_info* tail;char ui[20];}data;struct user_info* next;struct user_info* prev;
}UserInfo;UserInfo* create_node(){UserInfo* node = malloc(sizeof(UserInfo));node->next = NULL;node->prev = NULL;node->data.tail = node;return node;
}
*///从pack协议包中解析数据
void read_pack(pack_t* pack)
{char* buf = pack->buf;//记录buf已经读取的字节个数,方便定位到最靠前的未读取的位置int readed_size = 0;while(1){//将buf中最靠前未读取的2个字节,当作short读取,并赋值给data_sizeshort data_size = *(short*)(buf + readed_size);if(data_size == 0){printf("数据解析完毕\n");break;}//因为已经读取了2个字节,readed_size要自增2字节readed_size += 2;//准备一个大小为data_size+1的字符数组,用来接收数据char temp[data_size + 1];//初始化该数组memset(temp, 0, data_size+1);memcpy(temp, buf + readed_size, data_size);readed_size += data_size;printf("temp = %s\n", temp);}
}int main(int argc, const char* argv[])
{if(argc != 2){printf("请输入端口号!\n");return 1;}//将字符串转换成int类型portint port = atoi(argv[1]);//创建服务器套接字int server = socket(AF_INET, SOCK_STREAM, 0);//准备网络地址结构体: struct sockaddr_inaddr_in_t addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("0.0.0.0");//为套接字绑定ip和portif(bind(server, (addr_t*)&addr, sizeof(addr)) == -1){perror("bind()");return 1;}//监听listen(server, 10);//接收客户端的连接addr_in_t client_addr = {0};int client_addr_len = sizeof(client_addr);int client = accept(server, (addr_t*)&client_addr, &client_addr_len);if(client != -1){printf("=== 客户端连接 ===\n");}//读取客户端发来的消息while(1){int pack_size = 0;int res = read(client, &pack_size, 4);if(res == 0){printf("=== 客户端断开连接 === \n");return 0;}//当前的 pack_size = 4(pack.size大小) + 4(pack.type大小) + buf大小pack_t pack = {0};read(client, (char*)&pack+4, pack_size-4);pack.size = pack_size;//解析协议包的所有数据read_pack(&pack);}return 0;
}

        【client.c】

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;enum Type{TYPE_REGIST,TYPE_LOGIN
};typedef struct Pack{int size; //记录整个协议包实际大小(定长部分,占4个字节)enum Type type; //定长部分,占4个字节char buf[2048]; //变长部分,占count个字节int count; //记录指针偏移量,即buf使用了多少个字节
}pack_t;/*
typedef struct user_info{union Data{struct user_info* tail;char ui[20];}data;struct user_info* next;struct user_info* prev;
}UserInfo;UserInfo* create_node(){UserInfo* node = malloc(sizeof(UserInfo));node->next = NULL;node->prev = NULL;node->data.tail = node;return node;
}
*/void append(pack_t* pack, const char* data)
{char* buf = pack->buf;int len = strlen(data);//将buf的前2个字节当作short来存储数据len*(short*)(buf + pack->count) = len;pack->count += 2;memcpy(buf + pack->count, data, len);pack->count += len;pack->size = pack->count + 8;
}int main(int argc, const char* argv[])
{if(argc != 2){printf("请输入端口号!\n");return 1;}//将字符串转换成int类型portint port = atoi(argv[1]);int client = socket(AF_INET, SOCK_STREAM, 0);addr_in_t addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("192.168.126.155");if(connect(client, (addr_t*)&addr, sizeof(addr)) == -1){perror("connect()");return 1;}while(1){pack_t pack = {0};pack.type=TYPE_LOGIN;char name[20] = "";char pwd[20] = "";printf("请输入账号:");scanf("%20s", name);while(getchar() != 10);printf("请输入密码:");scanf("%20s", pwd);while(getchar() != 10);//前2个字节记录数据长度n,紧接着的n个字节记录数据本身//将name和pwd存入pack.buf中(即将name和pwd按照既定格式添加进协议包))append(&pack, name);append(&pack, pwd);//协议包总共占据 pack.count + 4 字节//pack.count 的长度,根据name和pwd的长度动态决定write(client, &pack, pack.size);}return 0;
}

相关文章:

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…...

回退 android studio emulator 的版本

前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os&#xff0c;因为雷电实时转义 arm 到 x64 的方案本质上还是 x64&#xff0c;会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通&#xff0c;调…...

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本&#xff0c;可以通过定时任务自动处理表空间不足的问题&#xff1b;但是之前那个脚本没有涵盖CDB模式下的PDB&#xff0c;这里将脚本做了一下更新&#xff0c;可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…...

ES6 迭代器 (`Iterator`)使用总结

Iterator&#xff08;迭代器&#xff09;是 ES6 引入的一种 接口&#xff0c;用于 顺序访问 可迭代对象&#xff08;Array、Set、Map、String、arguments、自定义对象等&#xff09;。 Iterator&#xff08;迭代器&#xff09;的作用有三个&#xff1a; 为各种数据结构提供一个…...

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…...

MongoDB开发规范

分级名称定义P0核心系统需7*24不间断运行&#xff0c;一旦发生不可用&#xff0c;会直接影响核心业务的连续性&#xff0c;或影响公司名誉、品牌、集团战略、营销计划等&#xff0c;可能会造成P0-P2级事故发生。P1次核心系统这些系统降级或不可用&#xff0c;会间接影响用户使用…...

让相机自己决定拍哪儿!——NeRF 三维重建的主动探索之路

我在 NeRF 中折腾自动探索式三维重建的心得 写在前面&#xff1a; 最近我在研究三维重建方向&#xff0c;深切感受到 NeRF (Neural Radiance Fields) 在学术界和工业界都备受瞩目。以往三维重建通常要依赖繁琐的多视图几何管线&#xff08;比如特征匹配、深度估计、网格融合等&…...

git reset和git revert的区别

git reset和git revert都是实现撤销的命令。 git reset是通过回退提交记录来实现撤销&#xff0c;原来指向的记录就像没提交过一样。 git revert是用于远程分支。执行后会产生一个新提交记录&#xff0c;而新提交的记录跟上一级的内容是相同的。 #恢复到当前上一级记录, 其中 …...

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …...

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…...

计算机网络的组成,功能

目录 ​编辑 什么是计算机网络&#xff1f; 一个最简单的计算机网络 集线器&#xff08;Hub&#xff09;&#xff1a; 交换机&#xff08;Switch&#xff09; 路由器&#xff08;router&#xff09; 互联网 计算机网络的组成&#xff1a;从组成部分看 硬件 软件 协议…...

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计&#xff0c;利用多点传感器采集与高效的数据处理技术&#xff0c;显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展&#xff0c;对飞机铅酸蓄电池的测试需求也…...

Vue3+codemirror6实现公式(规则)编辑器

实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…...

Mac M1 ComfyUI 中 AnyText插件安装问题汇总?

Q1&#xff1a;NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月&#xff0c;该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求&#xff0c;必须降级transformors &#…...

Github 2025-02-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2025-02-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8TypeScript项目3Jupyter Notebook项目2Rust项目2HTML项目2C++项目1Ruby项目1JavaScript项目1Svelte项目1非开发语言项目1Go项目1Oll…...

k8s部署go-fastdfs

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式可参考我的上一篇文章: k8s部署rabbitmq-CSDN博客文章浏览阅读254次,点赞3次,收藏5次。k8s部署rabbitmqhttps://blo…...

快速优雅解决webview_flutter不能Safari调试的问题

这个问题&#xff0c;网上一搜&#xff0c;又是让你去检索WKWebView&#xff0c;找到FWFWebViewHostApi.m文件&#xff0c;然后再改 iOS 的代码&#xff0c; 加一行 self.inspectable YES; 我们开发Flutter项目&#xff0c;尽量还是不要去改插件里的代码&#xff0c;好了不费…...

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…...

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…...

268. 丢失的数字

文章目录 1.题目2.思路3.代码 1.题目 268. 丢失的数字 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; **输入&#xff1a;**nums [3,0,1] **输出&#xff1a;**2 解释&#xff1a;n 3&a…...

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…...

el-table表格点击单元格实现编辑

使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中&#xff0c;使用 div 显示文本内容&#xff0c;单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData&#xff0c;tabClickIndex: null,tabClickLabel: ,用于判断是否…...

10分钟带你了解前端Vue Router

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 一、Vue Router 的基本概念 1.1 什么是 Vue Router&#xff1f; 1.2 Vue Router 的核心功能 二、Vue Router 的原理 2.1 路由模式 2.1.1 Hash 模式 2.1.2 Histo…...

maven如何分析指定jar包的依赖路径

在Maven项目中&#xff0c;分析指定JAR包的依赖路径是非常有用的&#xff0c;尤其是在解决依赖冲突时。Maven提供了一个命令行工具来帮助查看特定依赖的传递性依赖&#xff08;即依赖路径&#xff09;。以下是具体步骤&#xff1a; 使用 mvn dependency:tree 命令 打开命令行或…...

react的antd中Cascader级联选择如何回显

如果你的数据都是这个样子的 {"id": 1015,"pid": 0,"name": "电力、热力、燃气及水生产和供应业","children": [{"id": 1403,"pid": 1015,"name": "热力",},{"id": 140…...

工业物联网平台-视频识别视频报警新功能正式上线

前言 视频监控作为中服云工业物联网平台4.0的功能已经上线运行。已为客户服务2年有余&#xff0c;为客户提供多路视频、实时在线监视和控制能力。服务客户实时发现现场、产线、设备出现随机故障、事故等&#xff0c;及时到场处理维修。 视频识别&视频报警新功能当前正式上…...

【HarmonyOS NEXT】systemDateTime 时间戳转换为时间格式 Date,DateTimeFormat

【HarmonyOS NEXT】systemDateTime 时间戳转换为时间格式 Date&#xff0c;DateTimeFormat 一、前言 在鸿蒙应用开发中&#xff0c;经常需要将时间戳转化为标准时间格式。即&#xff1a;一串数字转化为年月日时分秒。 时间戳通常是一个长整型的数字&#xff0c;如 163041600…...

React 设计模式:实用指南

React 提供了众多出色的特性以及丰富的设计模式&#xff0c;用于简化开发流程。开发者能够借助 React 组件设计模式&#xff0c;降低开发时间以及编码的工作量。此外&#xff0c;这些模式让 React 开发者能够构建出成果更显著、性能更优越的各类应用程序。 本文将会为您介绍五…...

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…...

寒假2.6--SQL注入之布尔盲注

知识点 原理&#xff1a;通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信息 适用情况&#xff1a;一个界面存在注入&#xff0c;但是没有显示位&#xff0c;没有SQL语句执行错误信息&#xff0c;通常用于在无法直接…...

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload&#xff0c;不能被override&#xff0c;声明为虚函数也没有什么意思…...

说一下 Tcp 粘包是怎么产生的?

TCP 粘包是什么&#xff1f; TCP 粘包&#xff08;TCP Packet Merging&#xff09; 是指多个小的数据包在 TCP 传输过程中被合并在一起&#xff0c;接收方读取时无法正确分辨数据边界&#xff0c;导致数据解析错误。 TCP 是流式协议&#xff0c;没有数据包的概念&#xff0c;…...

基于STM32设计的仓库环境监测与预警系统

目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程&#xff0c;尤其是在制造业、食品业、医药业等行业&#xff0c;仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…...

在uniapp中修改打包路径

在uniapp中修改打包路径&#xff0c;主要涉及到对manifest.json文件的编辑。以下是详细的步骤&#xff1a; 1. 确定当前uniapp项目的打包配置位置 uniapp项目的打包配置通常位于项目的根目录下的manifest.json文件中。这个文件包含了项目的全局配置信息&#xff0c;包括应用的…...

Kali Linux 渗透测试环境配置(Metasploit + Burp Suite)

一、Kali Linux 系统准备 首先&#xff0c;确保你已经成功安装了 Kali Linux 系统。可以从官方网站下载镜像文件&#xff0c;并通过 U 盘引导安装等常规方式完成系统部署。建议使用最新稳定版本&#xff0c;以获取最新的软件包支持和安全更新。 安装完成后&#xff0c;登录系…...

Oracle 变更redo log文件位置

更改Oracle数据库的Redo log文件位置&#xff0c;可以按照以下步骤操作。 1.查询当前Redo log文件信息 select * from v$log; select * from v$logfile;通过查询结果可知Redo log文件放在/oradata/redofile 目录下。 2.拷贝redo log文件到新的位置/Data/redolog $cd /orada…...

力扣题库第495题目解析

文章目录 1.题目再现2.思路分析&&示例说明2.1第一个示例2.2第二个示例 3.代码解释 1.题目再现 这个题目的名字叫做提莫攻击&#xff0c;如果是玩游戏的小伙伴对于这个场景就很熟悉了&#xff1b; 这个实际上是说&#xff1a;已知的条件会给我们一个数组&#xff0c;在…...

Milvus 存储设计揭秘:从数据写入到 Segment 管理的全链路解析

作为一款云原生向量数据库&#xff0c;Milvus 的高效查询性能有赖于其独特的存储架构设计。然而&#xff0c;在实际使用过程中&#xff0c;许多社区用户常常会遇到以下问题&#xff1a; 为什么频繁调用 flush 后&#xff0c;查询速度会变慢&#xff1f; 数据删除后&#xff0c;…...

单片机通讯中的时序图:初学者的入门指南

一、什么是时序图&#xff1f; 在单片机的世界里&#xff0c;时序图是一种非常重要的工具&#xff0c;它用于描述信号在时间上的变化规律。简单来说&#xff0c;时序图就像是信号的“时间线”&#xff0c;它展示了各个信号线在不同时间点上的电平状态。通过时序图&#xff0c;我…...

ASP.NET Core JWT

目录 Session的缺点 JWT&#xff08;Json Web Token&#xff09; 优点&#xff1a; 登录流程 JWT的基本使用 生成JWT 解码JWT 用JwtSecurityTokenHandler对JWT解码 注意 Session的缺点 对于分布式集群环境&#xff0c;Session数据保存在服务器内存中就不合适了&#…...

Linux基础命令之Nginx中的rewrite功能(重新)

一、什么是Rewrite Rewrite也称URL Rewrite&#xff0c;即URL重写&#xff0c;就是把传入Web的请求重定向到其他URL的过程。 1. URL Rewrite最常见的应用是URL伪静态化&#xff0c;是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id123 使…...

4 前端前置技术(上):AJAX技术、Axios技术(前端发送请求)

文章目录 前言一、Ajax技术&#xff08;从服务端获取数据&#xff0c;发送各种请求&#xff09;0 接口文档管理&#xff1a;使用apipost等接口测试软件创建接口便于前端后端分离测试1 基本概念2 原生Ajax使用示例&#xff08;几年前的早期用法&#xff09; 二、 Axios技术(对原…...

三星手机为何不大力扩展中国市场?

三星在中国市场的手机销量长期低迷&#xff0c;主要原因可以归结为以下几点&#xff0c;这也解释了为什么三星可能没有大力扩展中国市场的计划&#xff1a; 1. 市场竞争激烈 中国市场已经被华为、OPPO、vivo、小米和苹果等品牌牢牢占据&#xff0c;这些品牌在产品设计、本地化…...

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…...

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…...

硬件电路基础

目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向&#xff1a; 正极->负极,正电荷定向移动方向为电流方向&#xff0c;与电子定向移动方向相反。 2.电荷&#xff08;这里表示负电荷&#xff09;运动方向&#xff1a; 与电流方向相反 1.4 测电压的时候 2. 地线…...

iOS 音频录制、播放与格式转换

iOS 音频录制、播放与格式转换:基于 AVFoundation 和 FFmpegKit 的实现 在 iOS 开发中,音频处理是一个非常常见的需求,比如录音、播放音频、音频格式转换等。本文将详细解读一段基于 AVFoundation 和 FFmpegKit 的代码,展示如何实现音频录制、播放以及 PCM 和 AAC 格式之间…...

探索前端框架的未来:Svelte 的崛起

引言 在前端开发的世界里&#xff0c;框架更新换代的速度仿佛光速。从 jQuery 到 Angular&#xff0c;再到如今大热的 React 和 Vue&#xff0c;开发者们不断追逐更轻量、更快、更易于维护的框架。如今&#xff0c;Svelte 正悄然崛起&#xff0c;并引发了关于前端框架未来的热烈…...

Gitea+Gridea 创建个人博客

历史文档存档&#xff0c;该方法目前已经无法使用&#xff0c;部署方法可供参考 Gitea部分 1.关于Gitea Gitea 是一个面向开源及私有软件项目的托管平台&#xff0c;是全球最大的代码托管平台之一。它采用 Git 分布式版本控制系统&#xff0c;为开发者提供了代码托管、版本控…...

DeepSeek-V3:开源多模态大模型的突破与未来

目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3&#xff1f; 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...