- 博客(22)
- 收藏
- 关注
原创 LINUX ---网络编程(三)
并发能力的实现方式不同,从完全不支持并发(单客户端)→串行处理(单循环)→并行处理(多进程),逐步提升了服务器的服务能力,但也带来了更复杂的实现和更多的系统资源消耗。主流程:socket()创建监听套接字 → 设置地址重用 → bind()绑定 → listen()监听 → 循环accept()接受连接。连接处理:每接受一个连接,通过pthread_create()创建线程,由线程执行do_client函数处理具体通信。:主进程负责接受客户端连接,为每个连接创建独立线程处理通信,实现并发服务。
2025-08-28 18:35:59
930
原创 LINUX --- 网络编程(二)
规定每个消息的固定长度(如 100 字节),不足则补位,接收方每次读取固定长度的数据。使用特殊字符(如\r\n)作为消息结束的标志,接收方遇到该标志即认为一个完整消息结束。发送端:操作系统会根据 TCP 缓冲区情况进行数据包的合并优化(Nagle 算法),导致多个小消息可能被合并发送;设计包含消息头和消息体的结构体,消息头中包含消息类型和消息长度等信息。服务器实现(维护客户端列表、处理不同类型消息、广播消息)主函数:初始化,创建客户端列表,循环接收消息并处理。处理下线消息:更新客户端状态,广播下线信息。
2025-08-27 20:02:27
438
原创 LINUX网络编程--网络的发展与通信
二十世纪五十年代,美苏进入冷战时期,由于安全问题,美国担心传统的通讯系统如果遇到核心枢纽被摧毁的情况,整个通讯网络就会瘫痪,于是DARPA开始研发计算机通信。
2025-08-22 18:25:02
756
原创 Linux软件编程 -- 系统概述与shell命令
世界上第一款操作系统:unix操作系统为了屏蔽底层不同的硬件平台,为上层提供统一的接口GNU:GNU's Not Unix 开源 GitHub GPL协议林纳斯 Linux重写了unix操作系统,类Unix操作系统Linux应用场景:服务器、嵌入式常见的Linux系统:Ubuntu、Debian、Redhat、CentOS等Linux操作系统是操作系统的核心,也称为内核,内核的主要功能为:内存管理多任务管理文件系统管理多任务间的通信网络管理硬件设备管理。
2025-08-14 18:01:09
503
原创 数据结构与算法 -- 二叉树
二叉树的编号(如果节点编号为n,左孩子编号:2n,右孩子编号为:2n+1)展开后是连续的,层:根节点层数为1,后续每引申出的一个节点就在该节点层数上+1;高度:节点高度是由该节点到最远的叶子节点的距离表示该节点高度;树的层树:树的层数由层数最高的节点对应的层数表示树的层数;深度:节点深度是由该节点到根节点的距离表示节点深度;后序遍历:访问顺序:左子树 → 右子树 → 根节点;节点:组成树形结构的一个小的单元称为节点;前驱(祖先):由哪个节点可以访问到该节点;树的高度 == 树的深度 == 树的层数;
2025-08-07 18:51:30
927
原创 数据结构与算法--栈与队列
链表、栈和队列都是一种线性结构(一对一);栈和队列是一种特殊的表状结构;栈只允许在栈顶位置入栈和出栈元素;链表可以在任意位置插入和删除元素;栈和队列只允许在指定位置插入和删除元素;
2025-08-06 19:31:36
394
原创 C语言学习---构造数据类型与位运算
全部初始化:按成员顺序赋值,如,一次性给所有成员设定初始值。enum 枚举类型名 {常量1,常量2,// 更多常量枚举常量默认是int类型,第一个常量默认值为 0,后续常量值是前一个常量值 +1 ,也可在定义时手动赋值修改,比如,让Mon为 1 ,Tue为 2 等,方便程序中用有意义的名称代替魔法数字(直接写的无意义数字 )。
2025-07-30 19:16:50
922
原创 C语言学习 --指针(二)
指针数组:是数组,数组的每个元素是指针。数组指针:数指针,指针指向整个数组。int *a[5];//定义一个数组,占40个字节,数组名为a,数组中每个元素都是int *型的指针//定义一个指针,占8个字节,指针变量名为a,是指向数组20个字节空间的指针。
2025-07-28 20:12:21
741
原创 C语言学习--指针
存储类型 数据类型 *变量名;int *p;char *p;float *p;double *p;int *p, *q;注意:不能使用未经初始化的指针2. 野指针:未经初始化的指针或者指向已经被释放空间的指针,称为野指针3. 空指针:指向内存地址为0x0的指针称为空指针,用NULL来表示内存地址0x0空间为只读空间,不能赋值,NULL指针不能执行*p = value操作int *p, *q;
2025-07-27 19:47:56
971
原创 函数传参与预处理命令
无参宏:宏名一般全大写区分变量。x : y是代码替换,编译时展开,无传参开销,简单逻辑优先用;和函数有诸多区别(参数类型等概念、调用传参过程、代码加载时机体积、执行效率、适用场景不同 )。
2025-07-24 20:24:48
420
原创 C语言函数
变量并非在整个程序中都能随意使用,作用域定义了它的有效范围:局部变量:只在 “最近大括号”内有效 ,仅在所在代码块内生效。比如函数内定义的变量,出了函数就失效,有效的避免变量冲突。
2025-07-23 19:40:12
593
原创 字符串数组与函数的学习
在 C 语言里,存放字符串要使用字符型数组,而存放字符串数组则需用字符型数组的数组,也就是二维字符型数组。定义:数组元素个数得是常量,例如2.元素访问与存储特性元素访问:可以通过:数组名[行下标][列下标] //访问一个字符元素,也能通过:数组名[行下标] // 访问数组第_行下标_行的字符串。存储特性:存放数据的空间是连续的,并且数据按顺序存放(先存第 0 行,再存第 1 行……)。能够避免编写重复性代码,让程序的模块化程度更高。函数的三种形式函数的定义:定义一个函数的实现;
2025-07-22 19:40:13
495
原创 学习嵌入式第六天
行数和列数必须为常量,格式为“数据类型 数组名[行数][列数]。本质:二维数组是由一维数组构成的一维数组,N维数组可以看成是由N-1维数组构成的一维数组。初始化:全部初始化:可以用大括号将所有元素值括起来进行初始化。局部初始化:只对部分元素进行初始化,未初始化的元素自动初始化为0。默认初始化:行可以省略,列不能省略,系统会根据初始化值自动推断行数。存储:连续性:数组在内存中所占空间大小等于每个元素所占空间大小乘以行数再乘以列数,元素在内存中是连续存储的。
2025-07-21 19:16:02
632
原创 【无标题】
1. 打印非输出控制符:printf("hello world\n");\0:字符串结束标志;gets 从终端接收一行字符串 gets可以接收带' '的字符串,scanf无法接收带' '的字符串。scanf认为' '和'\n'是用户结束数据的标志,所以不会读取到代码中。puts 向终端打印一行字符串 puts会多打印一个\n字符。%nd n:域宽,不足域宽,高位用空格补齐。_%c 从终端接收一个非空格和\n的字符。scanf :从终端接收格式化的字符串。%0nd 0:不足域宽,高位用0补齐。
2025-07-20 22:27:21
340
原创 学习嵌入式的第四天
解释:因为 1 是一个非 0 值,所以 while 循环的条件始终为真,循环会一直执行下去,除非在循环体内部有跳出循环的语句(如 break )。- 执行流程:先判断 表达式 的值,如果为真(非 0),则执行 语句块 ,然后再次判断 表达式 的值,直到 表达式 的值为假(0)时,退出循环。- 执行流程:先执行 语句块 ,然后判断 表达式 的值,如果为真(非 0),则再次执行 语句块 ,直到 表达式 的值为假(0)时,退出循环。表达式1:表达式2;
2025-07-18 21:32:55
358
原创 学习嵌入式第二天
字符常量:如 'a' 、 'A' 、 '#' 等,还有转义字符如 '\n' (换行符)、 '\t' (制表符)等,( '\八进制数' ,八进制数为3位),十六进制( '\x十六进制数' ,十六进制数2位)表示。整形常量:默认为 signed int ,有多种表示形式,如 123 、 -123 、 0123 (八进制)、 0x123 (十六进制)等,还可加 u / U (无符号)、 l / L (长整型)等后缀。缺省类型:void 表示,可修饰函数参数、返回值表示类型缺省,也可修饰指针表示指针指向类型缺省。
2025-07-15 19:46:37
310
原创 学习嵌入式第一天
gcc filename.c -o filename生成filename。ls -a查看当前目录所有文件包括隐藏文件;-编译gcc -s filename.c -o filename.s将C语言代码编译成汇编代码。-汇编gcc -c filename.c -o filename.o将汇编代码编译为二进制代码。-链接gcc filename.c -o filename将多个二进制代码链接成一个可执行程序。-预处理gcc -E filename.c -o filename.i处理和#号相关的代码。
2025-07-14 23:35:56
427
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅