自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1518)
  • 资源 (3)
  • 收藏
  • 关注

原创 Linux多线程网络服务器开发详解

本文介绍了如何将单线程服务器改造为多线程版本以提高并发处理能力。核心设计思路是主线程监听连接请求,每个客户端连接由独立子线程处理。实现步骤包括:定义客户端信息结构体、创建全局结构体数组、编写子线程处理函数和主函数实现。关键技术点包括参数转换、阻塞读取和资源释放。文章提供了完整的C语言代码示例,展示了多线程服务器的实现过程,包括初始化客户端数组、设置端口复用、创建监听套接字、绑定地址端口、循环接受连接并创建子线程处理通信等关键环节。

2026-01-26 09:12:41 507

原创 从多进程到多线程:构建高并发服务器的演进之路

多线程优势:共享全局区和堆区,通信方便,资源开销小。线程隔离:子线程拥有独立的栈区,互不干扰。最佳实践:在并发服务器中,优先使用解决资源回收问题,避免带来的阻塞冲突。线程安全:由于共享资源,如果多个线程同时操作全局变量,需引入互斥锁(Mutex)确保安全。

2026-01-25 10:50:13 621

原创 深度解析:多进程服务器中 accept() 被信号中断(EINTR)的处理机制

摘要:本文探讨了多进程TCP服务器开发中常见的"Interrupted system call"问题。当客户端断开连接时,子进程退出触发的SIGCHLD信号会中断父进程的accept()调用,导致EINTR错误。文章详细分析了该现象的成因,并提供了完整的代码解决方案:通过注册SIGCHLD信号处理函数回收子进程资源,并在accept()返回错误时检查errno是否为EINTR以重新建立连接。关键技术包括使用sigaction注册信号、非阻塞waitpid回收进程,以及正确处理系统调用中断

2026-01-25 10:47:32 708

原创 Linux多进程服务器编程:信号回收与资源管理详解

本文介绍了如何利用信号机制解决多进程TCP服务器中的僵尸进程问题。当子进程退出时,父进程通过捕获SIGCHLD信号异步回收资源,避免阻塞主循环。关键实现包括:1) 使用sigaction注册信号处理函数;2) 在回调函数中循环调用waitpid非阻塞回收所有退出的子进程;3) 确保信号处理在fork前注册。这种方法既解决了资源泄漏问题,又保证了服务器能持续接收新连接,是Linux多进程编程中进程管理的经典模式。

2026-01-24 09:30:35 629

原创 Linux多进程服务器编程详解:从零实现TCP并发服务器

本文介绍了一个基于Linux系统调用的多进程TCP服务器实现方案。服务器采用父进程监听、子进程处理的架构模式,通过fork()创建子进程独立处理每个客户端连接。文章提供了完整的服务器端和客户端代码实现,包括套接字创建、绑定、监听、连接接收等关键步骤。服务器能够同时处理多个客户端请求,各客户端通信互不干扰。测试结果表明,该方案能有效实现并发处理,客户端断开连接后子进程会正常退出并释放资源。编译运行步骤清晰,展示了多进程服务器的基本工作原理和实现方法。

2026-01-24 08:28:11 577

原创 突破单线程瓶颈:多进程并发服务器的设计与实现

本文探讨了Linux下多进程并发服务器的实现原理与方案。通过fork()系统调用创建子进程,父进程专职监听新连接,子进程负责通信处理,实现真正的并发。关键点包括:1)父子进程共享文件描述符但数据独立;2)必须关闭不需要的文件描述符;3)通过信号处理回收子进程资源。测试表明多进程模型能有效实现并行处理和数据隔离,虽然资源消耗较大,但稳定性优于单线程方案。文章提供了完整的代码实现和运行结果分析,总结了fork机制、进程分工等核心知识点及其难度系数。

2026-01-23 14:38:21 440

原创 从单机到并发:深度解析单线程 Socket 服务器的局限性与挑战

本文分析了单线程TCP服务器的局限性,指出其三大阻塞点(accept、recv、send)导致无法并发处理多个客户端连接。通过实验验证,当服务器处理一个客户端请求时,其他连接请求会被阻塞。文章提出了两种解决方案:多进程/多线程模型和I/O多路复用技术(Select/Poll/Epoll),并强调后者更适合高并发场景。最后总结了单线程服务器的不足及技术演进路径,为后续学习高性能服务器开发奠定基础。

2026-01-23 14:36:40 558

原创 TCP 深度解析:当“快发送者”遇到“慢接收者”——滑动窗口机制实战

本文通过Python代码模拟演示了TCP协议中滑动窗口机制如何解决发送方(Fast Sender)与接收方(Slow Receiver)速度不匹配问题。实验设置服务器每秒仅处理1KB数据,而客户端快速发送数据,当接收方窗口(win)减为0时,发送方进入阻塞状态,直到接收方处理数据并更新窗口大小。文章解析了TCP报文头关键字段(SYN/ACK/FIN/win/MSS)的作用,重点说明了滑动窗口的动态调节机制如何实现可靠传输。实验结果表明,TCP通过这种精妙的流量控制机制,确保了高速发送方不会压垮低速接收方,实

2026-01-22 08:52:40 912

原创 深入浅出 TCP 通信:从三次握手到滑动窗口的实战演操

本文通过Python代码演示了TCP协议的核心机制。首先模拟三次握手建立连接的过程,展示SYN/ACK标志位和序号交换;然后通过滑动窗口实验,验证接收端缓存满时发送阻塞的流量控制特性;接着分析数据校验中的序号计算逻辑;最后模拟四次挥手断开连接。文章结合代码与理论,直观呈现了TCP通过序号同步、动态窗口调整和标志位控制实现可靠传输的关键技术,包括连接建立、流量控制和连接释放的全过程。

2026-01-22 08:51:33 706

原创 深入理解 TCP:从三次握手到滑动窗口的底层逻辑与实战

本文深入浅出地解析了TCP协议的核心机制及其在Socket编程中的应用。首先拆解了TCP协议头关键字段,包括端口号、序号、窗口大小等;然后详解了三次握手和四次挥手的连接生命周期;重点剖析了滑动窗口的流量控制原理。通过Python代码实战演示了TCP通信流程,展示了从建立连接到数据传输的完整过程。文章最后总结了TCP协议的分层封装特性,强调其作为可靠传输协议的核心价值。全文以"快递员"作喻,生动展现了TCP协议如何通过复杂的首部字段确保数据安全有序传输,同时为应用层开发者提供简洁接口。

2026-01-21 08:20:41 764

原创 深入浅出 TCP 滑动窗口:原理、流量控制与代码实战

本文探讨了TCP协议中滑动窗口机制的实现原理及其在流量控制中的作用。滑动窗口通过动态调整窗口大小,让接收端能够根据自身处理能力控制发送端的传输速率。文章通过Python代码模拟了高并发发送与慢速接收场景,展示了当接收缓冲区填满时发送端被阻塞的现象。实验结果表明:前几KB数据快速传输后,当总发送量接近接收缓冲区上限时,发送速度显著下降,验证了滑动窗口的流量控制功能。这种机制有效防止了接收方缓冲区溢出,确保数据传输的可靠性,是TCP协议实现高效可靠通信的核心技术之一。

2026-01-21 08:19:17 752

原创 拆解 TCP 协议:头部结构、序号机制与滑动窗口实战

摘要:TCP协议本质是约定数据组织格式,其头部结构包含端口号、序列号、标志位等字段,通过大端模式传输。核心机制包括:1)随机生成的序列号解决乱序问题;2)ACK确认机制实现可靠传输;3)SYN/FIN标志位控制连接建立与断开;4)滑动窗口进行流量控制。通过Socket编程和tcpdump抓包可验证三次握手过程:客户端发送SYN(seq=x)→服务端回复SYN+ACK(seq=y,ack=x+1)→客户端发送ACK(ack=y+1)。关键点包括序列号随机性、ACK确认逻辑及窗口大小对传输速率的控制。

2026-01-20 11:31:26 612

原创 深入 TCP 核心:握手、挥手、滑动窗口与并发服务器实战

握手时,服务器的 SYN 和 ACK 可以合并在一个包里发。但在挥手时,服务器收到 FIN 后,可能还需要发送未处理完的数据,所以先回 ACK,等数据发完了再发自己的 FIN。

2026-01-20 11:22:27 610

原创 Socket 网络编程实战:启动顺序、环境配置与通信验证

本文介绍了Socket网络编程的实战要点。重点包括:1) 服务器和客户端的命名规范与编译方法;2) 必须遵循"服务器先启动"的原则;3) 本地回环测试和局域网通信的环境配置;4) 实战演示了周期性数据交互过程;5) 总结了常见问题排查指南,包括启动顺序、网络环境、Ping测试等。文章提供了完整的TCP通信验证流程,帮助开发者快速掌握网络编程的基本实践技巧和排错方法。

2026-01-19 09:30:42 592

原创 手写 TCP 客户端:Connect 连接与 inet_pton 实战详解

本文详细介绍了手写TCP客户端的实现过程,重点讲解了客户端与服务器的差异、关键函数使用和实战代码。主要内容包括:1) 客户端初始化阶段无需bind/listen/accept,核心流程为socket->connect->send/recv;2) 详细解析inet_pton函数用于IP地址转换和connect函数发起三次握手;3) 提供了一个完整的心跳客户端实现代码,包含连接建立、数据发送接收和连接断开处理。文章还总结了客户端开发的核心知识点和易错点,如IP转换注意事项、connect参数配置、数

2026-01-19 09:26:58 331

原创 深度解析:Linux 下 TCP 服务端编程核心实现

在网络编程中,构建一个稳定、高效的 TCP 服务器是所有进阶开发者的必修课。本文将根据 Linux 环境下的 Socket 编程规范,手把手带你实现一个经典的。

2026-01-18 10:17:09 525

原创 深入浅出 TCP 网络编程:从流程到核心 API 实现 (C语言版)

本文介绍了TCP网络编程的核心流程与实现方法。首先概述了TCP的三大特性(面向连接、安全可靠、流式传输),并对比了服务端(socket→bind→listen→accept→recv/send→close)和客户端(socket→connect→send/recv→close)的通信流程。重点讲解了网络字节序转换、listen()/accept()等关键API的使用要点,并提供了完整的回声服务器代码示例(含服务端和客户端实现)。最后总结了开发注意事项:区分监听/通信套接字、正确处理recv返回值、网络字节序

2026-01-18 10:13:56 643

原创 手写 TCP 服务器:从结构体初始化到错误处理详解

是一个阻塞函数,它会一直等到有客户端连接才会返回。即可,因为它内部已经包含了所需的其他头文件。我们将结合代码,逐一击破笔记中的重点和难点。,但在实际 TCP 编程中,只需要包含。的返回值是判断连接状态的核心。这是初学者最容易晕的地方。:我们在代码中定义和填充。

2026-01-17 10:41:01 406

原创 TCP Socket 编程:从握手到挥手的完整流程详解

TCP通信流程类比为电话通话:服务器通过socket()创建套接字,bind()绑定端口,listen()开始监听,accept()等待连接;客户端通过connect()发起连接。双方通信时需注意网络字节序转换(htons/htonl),服务器listen()的backlog参数限制排队数(通常128),accept()会返回新的通信套接字。示例代码展示了回声服务器的实现,服务器将客户端输入转为大写返回。关键点包括流程差异(服务器需bind/listen/accept,客户端只需connect)、字节序转换

2026-01-17 10:37:55 569

原创 Socket 编程客户端篇:Connect 隐式绑定与数据发送实战

本文介绍了Socket编程中客户端开发的核心知识点。重点讲解了connect函数的隐式绑定机制,即客户端端口由内核自动分配;分析了write/send函数的数据发送原理,指出数据实际是写入内核缓冲区而非直接发送;通过代码示例演示了TCP客户端的完整开发流程,包括连接建立、数据收发等关键步骤;最后总结了客户端开发的核心要点与常见误区,如服务器地址配置、端口绑定方式等,为网络编程初学者提供了清晰的实践指导。

2026-01-16 09:00:22 618

原创 TCP网络编程核心:内核缓冲区与 Recv/Send 实战详解

网络编程中,数据并非直接通过网线传输,而是通过内核缓冲区进行中转。服务器和客户端通过文件描述符(FD)进行通信,每个FD包含读/写缓冲区。read/write和recv/send函数均可用于数据传输,后者多了一个flags参数(通常设为0)。服务器通过accept获取通信FD,客户端通过connect建立连接。示例代码展示了Echo服务器和客户端的实现,演示了数据的收发过程。核心要点是理解缓冲机制和FD的正确使用。

2026-01-16 08:57:41 649

原创 Socket 编程客户端篇:Connect 连接与数据发送实战

本文介绍了TCP客户端编程的核心要点。主要内容包括:1) connect函数的使用方法及其在三次握手中的作用,重点指出客户端地址是隐式绑定的;2) 发送数据时write与send函数的区别,强调数据先存入内核缓冲区的机制;3) 通过完整示例代码演示了客户端连接、发送和接收数据的流程。文章还总结了客户端编程的关键知识点,包括函数调用顺序、错误处理等,并对比了与服务器端编程的差异。这些内容为理解TCP客户端工作原理和实现提供了清晰的指导。

2026-01-15 09:50:15 808

原创 Socket 编程实战:数据的接收发送与内核缓冲区揭秘

本文介绍了Linux网络编程中Socket通信的核心机制。重点讲解了内核缓冲区的双缓冲结构(读/写缓冲区),以及读写函数的本质是内存拷贝操作而非直接网络传输。对比了标准文件IO(read/write)和Socket专用IO(recv/send)的区别,并通过一个回声服务器的完整代码示例,演示了如何正确处理read返回值(包括EOF和错误情况)。文章还总结了TCP流特性、内核缓冲区作用等关键知识点,并强调了通信文件描述符的使用注意事项。

2026-01-15 09:47:22 580

原创 Socket 编程核心:Accept 函数与三次握手的终章

accept函数是TCP服务器中的关键阻塞函数,负责从监听套接字的连接队列中获取已建立的连接。它会返回一个新的通信文件描述符(cfd)专门用于客户端通信,而原监听描述符(lfd)继续负责接收新连接。该函数还能获取客户端地址信息(需转换大端序),若连接队列为空则会阻塞等待。典型使用流程包括:创建监听套接字→绑定→监听→在accept处阻塞→获取cfd后通信。注意addrlen参数需要初始化,且通信必须使用返回的cfd而非lfd。

2026-01-14 08:57:25 701

原创 Socket 编程进阶:Listen 函数与 Backlog 参数的秘密

listen()函数将套接字从主动模式切换为被动监听模式,其核心参数backlog指定未完成连接队列的最大长度(而非最大在线人数)。实验通过"偷懒服务器"(不调用accept)验证:当backlog=2时,前2-3个客户端能成功连接(内核可能有缓冲),后续连接会阻塞或失败。关键点包括:backlog影响的是排队连接数(典型值128),队列满会导致新连接被拒绝;必须在bind后、accept前调用listen。该机制类似于奶茶店的排队容量限制,与系统总资源无关。

2026-01-14 08:50:59 638

原创 Socket 编程必修课:Bind 函数与地址结构体的奥秘

摘要:本文详细讲解了TCP服务器中bind操作的必要性,通过实体店比喻说明服务器必须绑定固定IP和端口。解析了sockaddr与sockaddr_in结构体的区别及使用场景,强调内存布局一致性允许强制转换。提供了bind函数模板和错误处理示例代码,演示端口冲突时的处理方法。最后总结了bind操作的核心知识点,包括函数原型、结构体使用、常见错误及解决方案,帮助开发者正确实现服务器绑定功能。(150字)

2026-01-13 14:35:50 561

原创 Socket 编程:IP转换、字节序与地址结构详解

本文介绍了网络编程中的字节序转换、IP地址格式转换以及套接字地址结构的关键知识。主要内容包括:1)主机字节序与网络字节序的区别及转换函数(htons/ntohl等);2)IP地址字符串与数值的相互转换(inet_pton/ntop);3)sockaddr_in结构体的使用方法;4)通过代码示例演示了端口转换、IP转换和套接字创建过程。文章还提供了助记口诀和知识小结表格,帮助开发者掌握网络编程中的核心概念和API使用要点。这些知识是进行TCP/IP网络通信编程的基础。

2026-01-13 14:21:25 646

原创 揭秘 Socket 缓冲区与数据封装

本文揭示了网络编程中监听和通信描述符的内核差异,以及数据读写背后的真实流程。监听描述符的读缓冲区存储连接请求,通信描述符的读/写缓冲区分别存储接收和待发送数据。实验证明,write()仅将数据拷贝到内核缓冲区而非直接发送,而read()从缓冲区读取数据。数据在网络传输中会经过多层封装和解封装。关键结论:程序员操作的是缓冲区而非直接操作网络,理解这一机制对网络编程至关重要。

2026-01-12 08:34:49 1144

原创 TCP 通信全流程:服务器与客户端

TCP通信流程可以类比电话服务:服务器端需要6个步骤(socket、bind、listen、accept、read/write、close),核心是等待连接;客户端仅需4步(socket、connect、read/write、close),核心是主动连接。通过一个问候系统实例展示了具体实现:服务器接收客户端发送的名字并返回问候语。关键区别在于服务器需要绑定地址并管理两种文件描述符(监听和通信),而客户端只需建立单连接。整个流程体现了TCP通信的基本原理和实现方法。

2026-01-12 08:31:32 802

原创 构建 TCP 服务器:从绑定到通信

本文详细介绍了TCP服务器开发的六个核心步骤:1)创建套接字(socket);2)绑定地址(bind);3)设置监听(listen);4)接受连接(accept);5)数据通信(read/write);6)关闭连接(close)。重点解析了服务器必须绑定地址的原因、listen函数创建等待队列的作用以及accept的阻塞特性。特别区分了监听描述符(lfd)和通信描述符(cfd)的不同职责:lfd负责检测新连接,cfd负责具体通信。文章通过餐厅迎宾员和服务员的比喻形象说明了二者的关系,并提供了完整的C语言代码

2026-01-11 10:06:29 616

原创 揭秘 Socket 本质:内核缓冲区与文件描述符

本文深入解析了Socket编程的核心概念和工作原理。首先揭示了Socket的本质是文件描述符,对应内核中的读写缓冲区而非磁盘文件。然后详细对比了服务器端和客户端的不同工作流程:服务器采用被动监听模式,需经历socket-bind-listen-accept-read/write-close完整流程;客户端则是主动连接模式,仅需socket-connect-read/write-close。通过代码示例展示了监听套接字和通信套接字使用不同文件描述符的关键机制,并解析了内核缓冲区的数据流转过程。最后以表格形式总

2026-01-11 10:01:15 432

原创 TCP 协议核心与 Socket 编程入门:从理论到代码实战

TCP协议的核心特性包括面向连接、可靠传输和流式传输,通过三次握手建立连接和四次挥手断开连接确保通信安全。服务器端通过socket()、bind()、listen()和accept()等系统调用实现网络通信,而客户端则使用connect()发起连接。本文通过实现一个回声服务器示例,展示了TCP套接字编程的基本流程,包括创建套接字、绑定地址、监听连接、数据传输等关键步骤,并对比了TCP与UDP在传输方式上的差异。

2026-01-10 09:56:48 1006

原创 Socket 编程进阶:`inet_ntop` 函数与 `sockaddr` 结构体详解

当网络包到达你的程序时,IP 地址是 网络字节序(大端) 的二进制数据。为了让人能看懂,我们需要把它还原成点分十进制字符串(如 )。这就要用到 函数。2. 参数解析(敲黑板!):协议族。 (IPv4) 或 (IPv6)。:传入参数。指向存放了大端 IP 的内存地址(通常是 里的 )。:传出参数。你需要先准备好一个字符数组,函数会把转换好的字符串填进去。:缓冲区大小。告诉函数 有多大,防止写越界。IPv4 建议至少定义 16 字节 ()。IPv6 建议至少定义 46 字节 ()。

2026-01-10 09:41:03 772

原创 Socket 编程利器:深入解析 `inet_pton` 函数

inet_pton函数是网络编程中用于IP地址转换的核心工具,它能将人类可读的IP字符串转换为网络字节序的二进制格式。该函数支持IPv4和IPv6,自动处理字节序转换,并返回三种状态:1表示成功,0表示无效输入,-1表示参数错误。通过两个代码示例展示了标准IPv4转换和错误处理场景,验证了其正确性和健壮性。使用时需包含<arpa/inet.h>头文件,注意区分AF_INET和AF_INET6协议族,并正确处理返回值以确保程序可靠性。该函数简化了网络编程中的地址处理,是构建稳定网络应用的基础工具。

2026-01-09 09:35:15 921

原创 搞懂网络编程:字节序与 IP 地址转换全攻略

本文介绍了计算机存储多字节数据时的两种字节序:小端序(主机字节序)和大端序(网络字节序)。重点讲解了C语言中用于主机序和网络序转换的函数命名规则和使用方法,包括端口号转换(htons/ntohs)和IP地址转换(htonl/ntohl)。通过代码示例演示了整数和字符串形式的IP地址转换过程,并对比了转换前后的数据格式差异。最后总结了网络编程中字节序转换的核心知识点,强调网络通信必须使用大端序,并推荐使用现代转换函数inet_pton和inet_ntop来处理字符串形式的IP地址。

2026-01-09 09:31:47 1053

原创 彻底搞懂“大小端”存储机制

本文介绍了计算机数据存储中的大端(Big-Endian)和小端(Little-Endian)两种字节序模式。小端模式将低位字节存储在低地址,主要用于PC电脑;大端模式将高位字节存储在低地址,符合人类阅读习惯,是网络通信标准。通过C代码示例演示了如何检测系统字节序,并展示了网络通信中必要的字节序转换函数(htonl/htons)。文章强调字符串作为单字节序列不受字节序影响,并总结了两种模式的存储规则、应用场景及转换方法。理解字节序对跨平台数据传输和网络编程至关重要。

2026-01-08 09:13:39 319

原创 彻底搞懂网络编程中的“字节序”与 IP 地址转换

摘要: 字节序决定多字节数据在内存中的存储顺序,分为小端序(低位存低地址,如x86/ARM)和大端序(高位存低地址,网络标准)。PC默认小端序,网络传输需转换为大端序(如htonl函数)。IP地址转换函数(inet_pton/inet_ntop)自动处理字节序,字符串无此问题。关键点:发送整型数据前需转换,单字节类型(如char)无需处理。

2026-01-08 09:11:16 797

原创 Socket 编程进阶:为什么必须搞懂“字节序”与“大小端”?

本文介绍了Socket网络通信的核心概念,重点讲解了字节序(Byte Order)在网络编程中的重要性。文章通过插头插座比喻形象说明客户端/服务器角色,详细分析了大端序和小端序的区别及其对通信的影响。通过两个C语言代码示例演示了如何检测主机字节序以及正确使用htons/htonl函数进行网络字节序转换。最后总结了网络编程的关键知识点,包括套接字基础、CS架构、字节序转换函数及适用范围,强调字节序转换是保证网络通信正确性的必要条件。

2026-01-07 08:53:47 745

原创 Socket 编程实战

本文介绍了网络通信中的数据封装过程及Socket编程基础。数据在网络传输中需经过应用层、传输层、网络层和接口层的层层封装,而程序员只需关注应用层数据。文章通过C语言实现的TCP通信示例,展示了客户端发送"hello,world"到服务器的完整流程,包括Socket创建、绑定、监听和连接等核心操作。重点解析了操作系统在后台自动完成的TCP/IP封装工作,说明程序只需处理应用层数据,底层封装由系统自动完成。最后总结了TCP协议特点和数据封装的核心概念,帮助理解网络编程的基本原理。

2026-01-07 08:43:24 1200

原创 网络协议到底长什么样?从二进制视角看 TCP/IP

网络协议本质是通信双方约定的数据格式,如同对话需使用相同语言。文章通过C语言结构体展示了TCP、UDP和IP协议的报文格式,并提供了Python代码示例,演示如何手工构造和解析UDP/IP数据包。代码使用struct模块精确控制字节排列,完整呈现了从应用层数据到网络层封装的完整流程,以及接收端的反向解析过程。该示例生动展现了网络协议分层封装的核心原理。

2026-01-06 08:47:45 909 1

MFC编程 -- 管理系统修改及限制.zip

实现对列表的修改及添加数据的限制

2022-05-30

MFC编程 -- 管理系统保存读取

简单实现对列表的读取和保存操作

2022-05-30

MFC编程 -- 管理系统添加.zip

实现对列表的添加操作

2022-05-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除