- 博客(31)
- 收藏
- 关注
原创 TCP,UDP,wireshark抓包
在TCP协议中,数据是以流(stream)的形式传输的,这种流数据没有明确的数据开始和结尾边界,因此容易出现粘包现象。具体来说,当发送方连续发送多个数据包时,由于TCP的缓冲机制,这些数据包可能会被合并成一个大的数据包发送给接收方,或者在接收方由于接收缓冲区的原因,多个数据包被合并在一起处理,这就是粘包现象。的首部是TCP协议数据包中的一个关键部分,它包含了用于传输控制的各种重要信息。TCP报文段首部后面还可以有4n字节(n为整数)的可选字段,这些字段是根据需要而增加的,用于支持TCP的各种扩展功能。
2024-08-23 19:37:46
566
原创 Linux系统编程——网络通信
在创建套接字后,套接字默认没有绑定到任何地址,通过bind函数可以为套接字指定一个地址,这样就可以在网络上监听该地址的通信。accept函数在网络编程中用于从已监听的套接字上接受一个新的连接。当服务器套接字处于监听状态并且有客户端尝试连接时,accept函数会从等待连接队列中取出第一个完成的连接,并创建一个新的套接字来处理这个连接。2 type参数指定套接字的类型,常见的有SOCK_STREAM(面向连接的流式套接字,如TCP)和 SOCK_DGRAM(无连接的数据报套接字,如UDP)。
2024-08-22 20:58:08
841
原创 学习记录第三十三天
const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )//a -- ascii。htons --- h(host) to n(network) s (short) //16位的数据。htonl --- h(host) to n(network) l (long) //32位的数据。int flags, //0 --- 默认。端口号: 16位数值(unsigned short ) //0~65535 (65536个数)
2024-08-21 20:39:13
666
原创 学习记录第三十天
本身并不能传递大量数据;信号被称为软中断(软件层面),软中断是操作系统中用于处理异步事件的一种机制,它通过软件方式模拟硬件中断的行为,使得系统能够在不直接打断当前进程执行的情况下,处理一些非紧急但耗时的任务。软中断的典型应用之一是“下半部”(bottom half)机制,即将硬件中断处理过程分为“上半部”和“下半部”两个阶段,其中“下半部”即为软中断处理的部分。有名管道:是一种特殊的文件,存在于内存中,在系统中有对应的名称,文件大小为0字节;管道没有满,write将数据写入,并返回实际写入的字节数;
2024-08-18 17:51:20
272
原创 学习记录第二十九天
如果管道满了,写入操作将会阻塞,直到有足够的空间为止(除非是非阻塞模式或使用了特定的系统调用选项)。在创建管道时,系统返回两个文件描述符:一个用于读(read),另一个用于写(write)。如果需要双向通信,必须创建两个管道,一个用于一个方向的通信,另一个用于相反方向的通信。通常,一个进程(如父进程)会写入管道,而另一个进程(如子进程)会从管道中读取数据。管道:通过操作系统提供的内存缓冲区,在内核中实现的通信机制。函数尝试对信号量执行P操作,但如果信号量的值为0,则不会阻塞调用线程,而是立即返回一个错误。
2024-08-16 19:47:54
629
原创 学习记录第二十八天
1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。失败时返回错误码,可能的错误码同样包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。失败时返回错误码,可能的错误码包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。锁的顺序:在多个锁的场景下,需要保证所有线程都以相同的顺序获取锁,以避免死锁。mutex:指向需要尝试锁定的互斥锁变量的指针。
2024-08-15 21:58:40
915
原创 学习记录第二十七天
定义:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。特性独立调度和分派的基本单位:在多线程操作系统中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。可并发执行:一个进程中的多个线程可以并发执行,甚至允许在一个进程中所有线程都能并发执行,同时,不同进程中的线程也能并发执行。共享进程资源。
2024-08-14 20:26:55
546
原创 学习记录第二十六天
3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错。1,子进程和父进程做相同的事----创建子进程 执行任务。
2024-08-13 21:33:07
592
原创 学习记录第二十五天
当一个进程暂停后又继续,会从前台进程变成后台进程,用ps查看会发现失去了'+'号,此时进程无法用ctrl + c终止,只能用kill -9 pid号终止。(1)创建进程,为了实现多任务,fork()创建,pid_t fork(void),父进程返回子进程的pid号,子进程返回0;(4)kill:给进程发信号,kill -l查看kill的所有信号,常用信号有kill -9 pid号:终止进程。kill -19 pid号:暂停进程,kill -18 pid号:继续进程,T:停止状态,收到停止信号或正在被跟踪。
2024-08-12 20:40:20
340
原创 学习记录第二十二天
删除一个硬链接不会影响其他硬链接,直到文件的最后一个链接被删除,文件数据才会被释放。该函数定义在<pwd.h>头文件中,并返回一个指向struct passwd结构的指针,该结构包含了用户的多种信息,如用户名、用户ID、群组ID、全名、家目录和登录Shell等。在C语言中用于将指定文件的大小截断到指定的长度,即使文件当前的大小大于指定长度,文件的内容也会被截断,而小于指定长度的部分将被填充为未初始化的数据。truncate函数可以用于文件的大小调整,但需要注意的是,它不会改变文件的内容,仅调整文件的大小。
2024-08-08 19:39:51
786
原创 学习记录第二十一天
的指针,该结构体包含了目录项的信息(如文件名)。返回的目录流中读取一个目录项。返回值:成功时返回当前时间的秒数。函数用于获取当前时间(自1970年1月1日以来的秒数)。功能:打开一个目录流,以便可以读取目录内容。功能:获取当前工作目录的绝对路径。功能:获取文件或目录的状态信息。)- 用于存储状态信息的结构体。功能:改变当前进程的工作目录。)- 要打开的目录的路径。)- 要关闭的目录流指针。)- 要创建的目录的路径,)- 要删除的目录的路径。)- 新的工作目录路径。)- 文件或目录的路径,
2024-08-07 21:12:44
232
原创 学习记录第二十天
O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。阻塞:程序因为某种条件没有被触发,而导致'0' '\0'1、不支持O_APPEND的追加模式,无法生成空洞文件。2、lseek函数执行失败,文件指针还在偏移前的位置。它是一个基于Linux内核的没有缓存的IO机制。O_ASYNC异步io,什么时候io不确定,内核每打开一个文件就会获得一个文件 描述符。.2 操作对象不在是流,而是文件描述符。通过文件描述符向文件中写一串数据。通过文件描述符读取文件中的数据。
2024-08-06 19:39:59
691
原创 学习记录第十九天
这里的 stream 是一个指向 FILE 结构的指针,指向已打开的文件流。char 参数是要写入文件的字符(作为 int 类型),stream 是一个指向 FILE 结构的指针,指向目标文件流。它定义在 stdio.h 头文件中,并返回一个指向 FILE 结构的指针,该结构包含了有关打开文件的信息。这里的 filename 参数是一个指向字符串的指针,指定了要打开的文件的名称。5.fread 函数返回成功读取的数据项数量,如果达到文件末尾或发生读取错误,返回的数量可能小于 nmemb。
2024-08-05 20:56:27
852
原创 学习记录第十八天
shell脚本 ----配置文件 ----对文件进行读写操作进程 ----运行起来的程序网络 ----数据共享Htmldb ----网页和数据库shell脚本的本质就是一系列shell命令的集合Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
2024-08-03 19:00:01
390
原创 学习记录第十六天
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;有若干个节点(Node)组成,节点包含值域和指针域,节点从堆上来;结构体之间无法进行大小关系比较,成员间可以进行比较;
2024-08-01 18:26:14
238
原创 学习记录第十五天
我们可以定义一个指向数组的指针int *p = a;a本身就是一个指针,可以直接赋值给指针变量 p。a是数组第 0 个元素的地址,所以int *p = a;也可以写作int *p = &a[0];。也就是说,a、p、&a[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。再强调一遍,“a本身就是一个指针”这种表述并不准确,严格来说应该是“a 被转换成了一个指针”。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)
2024-07-31 19:29:46
915
原创 学习记录第十三天
指针与字符串的关系字符串字面量在C语言中以空字符 '\0' 结尾,字符型指针指向字符串的起始位置,可以通过指针遍历整个字符串,直到遇到空字符。字符型指针支持算术运算,包括自增(++)和自减(--)操作,以及与其他整数的加减运算。字符型指针在C语言中是一种特殊的指针类型,用于存储字符数据的地址。指针算术运算时,指针的增量是根据其指向的数据类型决定的,例如 char * 类型的指针每次自增会移动1个字节。指向字符串常量的指针不能修改字符串的内容,因为字符串常量存储在只读的内存段。指向的内存单元内容发生变化。
2024-07-30 20:41:33
379
原创 指针第一天
遍历数组:使用指针可以方便地遍历数组,如 for(int *p = numbers;赋值:指针可以通过取地址符&与变量关联,如 p = &a;可以通过指针访问数组元素,如 p[0] 或 *(p+0) 都表示数组的第一个元素。指针算术:指针可以进行加减运算,p+1 表示指向下一个元素的指针。动态内存管理:使用动态分配的内存后,要及时释放,避免内存泄漏。指针解引用:确保指针指向有效的内存地址后再进行解引用操作。定义:指针是一种特殊的变量,用于存储内存地址,指针 + 1:在原有的地址的基础上加基类型的字节。
2024-07-29 18:52:45
307
原创 学习记录第十二天
与普通局部变量不同,局部静态变量在第一次被初始化后,其值在函数调用之间保持不变,即其生存期跨越了函数调用的界限,直到整个程序结束。全局静态变量的生存期是整个程序的生命周期,但其作用域被限制在声明它的文件内,即在其他源文件中不可见,这有助于避免命名冲突。不过,在现代C语言编程中,auto关键字的使用并不常见,因为局部变量的默认存储类型就是自动的,所以通常不需要显式地使用auto来声明。用于定义宏,可以是无参宏或带参宏。在所有函数体之外声明的变量,它可以在定义后的整个程序的任何地方被访问,包括所有的函数;
2024-07-28 18:59:33
867
原创 学习记录第十一天
因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)字符型数组在形参传参时,不需要传递元素个数,它是通过‘\0’作为结束语句来判断。sizeof()只读取类型名,在函数中sizeof(a)只占8个字节。在用数组元素做函数实参时,把实参的值传给形参,是”值传递“方式。数组名也可以作为函数的形参和实参,传递的是首元素的地址。数组元素可以用作函数实参,但不可以用作形参。数据传递的方向是从实参传到形参,单向传递。
2024-07-26 20:12:09
195
原创 学习记录第十天
形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。因此形式参数只在函数中才有效。实参向形参的数据传递为值传递,函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。栈区:FILO 先进后出,后进先出;Linux下大约8Mb,Windows下约1Mb。在调用函数时,它们都必须有确定的值,以便把这些值传送给形参。实参可以是:常量、变量、表达式、函数等。形式参数是指函数名后括号中的变量。在函数调用的过程中自己调用自己;真实传给函数的参数,叫实参。字符串常量区:存放字符串。
2024-07-25 19:24:54
310
原创 学习记录第九天
类型说明符 数组名[常量表达式][常量表达式]其中,`类型`是数组元素的数据类型,`数组名`是数组的标识符,`常量表达式1`和`常量表达式2`分别指定了数组的行数和列数。二维数组可以看成一维数组的数组;
2024-07-24 19:35:25
338
原创 学习记录第八天
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例:fgets(s,sizeof(s) / sizeof(s[0]),stdin);C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符。如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现越界访问。如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
2024-07-23 20:25:45
296
原创 一维数组的学习
类型说明符 数组名[常量表达式] int a[10]数组的数组名代表数组首元素的地址:数组不能被整体赋值;冒泡排序法:相邻两个元素两两比较,小的放前,大的放后。1、花括号内个数超过数组个数,会造成越界访问。在数组合适的位置上放合适的数;单一性:数组元素在内存中存放字节都相同。2、数组不初始化,里面的值,都是随机数。常量表达式不能为空类型(void)有序性:数组下标小的在下标大的前面。连续性:数组内元素没有字节隔开。3、数组初始化后,缺元素 补0。4、可变的对象不能初始化。
2024-07-22 19:56:21
197
原创 c语言循环
goto语句为无条件跳转语句,一般为:goto 语句标号;break语句用来跳出一个循环,又称循环断路,只能跳出自身所在循环;continue又称循环短路,它会终止本次循环,直接进入下一次循环;while(表达式)表达式非0时,执行while内语句;do{循环体}while(表达式):先执行后判断。while语句一般实现“当”型循环;do while后面必须加“;while()后面不加分号;表达式3:使循环结束的语句。for 循环后不加“;例如:质数 ,合数的判断。表达式1:循环变量赋值。
2024-07-20 19:11:45
137
原创 c语言学习
else if不能独立出现,同样else if()后不能加分号;如果操作数为真,则结果为假;如果操作数为假,则结果为真。只要两个操作数中有一个为真,结果就为真。2.If(表达式)1 else 语句 2。else if(表达式2)语句2。case 常量表达式2: 语句2。(逻辑非)——(取反)case 常量表达式: 语句1。if()后不能加分号‘;3、>= :大于等于。4、<= :小于等于。2、|| (逻辑或)1.if(表达式) 语句。3.if(表达式)语句1。
2024-07-19 20:38:53
115
原创 C语言学习
输入输出的概念:putchar:输出一个字符;putchar(65)输出A;返回值为int型;getchar:输入一个字符,一次读取一个字符包括空格,换行,TAB,储存到缓存区,遵循先入先出原则;它是无参数函数键盘————缓存区————getchar。
2024-07-18 18:41:18
172
原创 C语言入门
:取余,符号与左操作数有关,与右操作数无关,不能%0,值一定小于右操作数;=:赋值(开辟空间的随机数更改成指定的值)int = short:符号位拓展:正数补0,负数补1。=:初始化 (开辟空间的同时赋值)变量开辟内存空间后,内存空间为随机的,若不赋值,则为随机数。++:++i:先+再用,表达式和i都加了;逗号运算符:顺序求值运算符,输出为最后的值。rvalur:右值,运算符右边的常量,临时变量是右值。coust int:将变量变为只读变量,不可修改。lvalur:左值,运算符左边的变量。
2024-07-17 19:26:41
299
原创 c语言入门
1.标志符:字母,数字,下划线;(数字不能做第一个)关键字(不能做标志符)2.整型整型常量:十进制:八进制:0--- 最高位为7十六进制0x-- 最高位为f。
2024-07-16 18:18:34
138
原创 学习记录第一天
文件夹后+ -r:删除 文件夹。常量:程序运行过程中,其值不变的量。变量:程序运行过程中,能被改变的量。pwd :查看当前目录。数据类型:整型,字符型,浮点型;ls: 查看当前文件下的内容。mkdir:创建文件夹。mv:移动文件和文件夹。编辑状态:按“i”进入。touch:创建文件。
2024-07-15 18:47:34
102
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人