C 语言进阶
文章平均质量分 82
融码一生
专注 Python 相关应用(数据分析、Web 服务 & 爬虫、机器学习 & 深度学习、NLP)、算法、C/C++
展开
-
13.16、UDP
TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。原创 2024-04-23 08:40:29 · 1017 阅读 · 0 评论 -
13.15、在 socket 编程中使用域名
客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误。原创 2024-04-23 08:39:31 · 455 阅读 · 0 评论 -
13.14、网络数据传输时的大小端问题
不同 CPU 中,4 字节整数 1 在内存空间的存储方式是不同的。4 字节整数 1 可用 2 进制表示如下:原创 2024-04-23 08:38:00 · 1069 阅读 · 0 评论 -
13.13、socket 编程实现文件传输功能
这节我们来完成 socket 文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。原创 2024-04-23 08:37:02 · 245 阅读 · 0 评论 -
13.12、如何优雅地断开 TCP 连接?
调用 close()/closesocket() 函数意味着完全断开连接,即不能发送数据也不能接收数据,这种“生硬”的方式有时候会显得不太“优雅”。原创 2024-04-23 08:35:20 · 300 阅读 · 0 评论 -
13.11、TCP 四次握手断开连接
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。原创 2024-04-23 08:34:26 · 385 阅读 · 0 评论 -
13.10、TCP 数据的传输过程
上图给出了主机 A 分 2 次(分 2 个数据包)向主机 B 传递 200 字节的过程。首先,主机 A 通过 1 个数据包发送 100 个字节的数据,数据包的 Seq 号设置为 1200。主机 B 为了确认这一点,向主机 A 发送 ACK 包,并将 Ack 号设置为 1301。原创 2024-04-23 08:33:34 · 281 阅读 · 0 评论 -
13.9、TCP 数据报结构以及三次握手
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。原创 2024-04-23 08:32:15 · 1199 阅读 · 0 评论 -
13.8、TCP 协议的粘包问题(数据的无边界性)
上节我们讲到了 socket 缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。原创 2024-04-23 08:31:23 · 329 阅读 · 0 评论 -
13.7、socket 缓冲区以及阻塞模式详解
可以使用 write()/send() 函数发送数据,使用 read()/recv() 函数接收数据,本节就来看看数据是如何传递的。原创 2024-04-23 08:30:32 · 495 阅读 · 0 评论 -
13.6、让服务器端持续监听客户端的请求
前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像 Web 服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。原创 2024-04-23 08:29:03 · 270 阅读 · 0 评论 -
13.5、使用 socket 编程实现回声客户端
所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。原创 2024-04-23 08:28:11 · 401 阅读 · 0 评论 -
13.4、socket 编程
不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字。socket() 在两个平台下的参数是相同的,不同的是返回值。原创 2024-04-21 14:00:12 · 782 阅读 · 0 评论 -
13.3、socket 演示程序
功能:客户端从服务器读取一个字符串并打印出来原创 2024-04-21 13:59:14 · 959 阅读 · 0 评论 -
13.2、OSI 七层模型、TCP/IP、MAC、端口号
OSI(Open System Interconnection,开放式系统互联)模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。原创 2024-04-21 13:58:11 · 489 阅读 · 0 评论 -
13.1、socket(套接字)
● 学习 socket(套接字)编程,也就是学习计算机之间如何通信,并用编程语言来实现它。● socket 通信技术(网络编程)就是两台联网的计算机之间交换数据的技术。原创 2024-04-21 13:56:57 · 783 阅读 · 0 评论 -
12.9、使用 C++ 11 进行多线程编程
当在 Linux 环境中编写 C++ 的多线程程序时,既可以借助 POSIX 标准提供的 实现,也可以借助 C++11 标准提供的头文件实现。原创 2024-04-21 13:53:11 · 633 阅读 · 0 评论 -
12.8、自定义线程属性
程序中,pthread_create() 函数需要传递 4 个参数,其中第二个参数 NULL 表示以系统默认的属性创建线程。原创 2024-04-21 13:52:08 · 925 阅读 · 0 评论 -
12.7、如何避免线程发生死锁
很多初学者在使用这些方法的过程中,经常会发生“线程一直被阻塞”的情况,这种情况称为“死锁”。原创 2024-04-21 13:51:07 · 311 阅读 · 0 评论 -
12.6.5、使用读写锁实现线程同步
多线程程序中,如果仅有少数线程会对共享数据进行修改,多数线程只是读取共享数据的值,就适合用读写锁解决“线程间抢夺资源”的问题。原创 2024-04-21 13:50:03 · 1012 阅读 · 0 评论 -
12.6.4、使用条件变量实现线程同步
假设一个进程中包含多个线程,这些线程共享变量 x,如果希望某个(或某些)线程等待x==10条件成立后再执行后续的代码,该如何实现呢?原创 2024-04-21 13:49:05 · 581 阅读 · 0 评论 -
12.6.3、使用信号量实现线程同步
信号量(Semaphore)的概念最早由荷兰计算机科学家 Dijkstra(迪杰斯特拉)提出,有时又称“信号灯”。原创 2024-04-21 13:47:53 · 711 阅读 · 0 评论 -
12.6.2、使用互斥锁实现线程同步
互斥锁实现多线程同步的核心思想:有线程访问进程空间中的公共资源时,该线程执行“加锁”操作(将资源“锁”起来),阻止其它线程访问。访问完成后,该线程负责完成“解锁”操作,将资源让给其它线程。当有多个线程想访问资源时,谁最先完成“加锁”操作,谁就最先访问资源。原创 2024-04-21 05:46:26 · 952 阅读 · 0 评论 -
12.6.1、线程同步机制
多线程程序中各个线程除了可以使用自己的私有资源(局部变量、函数形参等)外,还可以共享全局变量、静态变量、堆内存、打开的文件等资源。原创 2024-04-21 05:44:52 · 218 阅读 · 0 评论 -
12.5、线程对 Cancel 信号的处理
通过调用 pthread_cancel() 函数,一个线程可以向同进程内的另一个线程发送“终止执行”的信号(Cancel 信号),使目标线程结束执行。原创 2024-04-21 05:43:56 · 418 阅读 · 0 评论 -
12.4、获取线程函数的返回值
如果想获取某个线程执行结束时返回的数据,可以调用 pthread_join() 函数来实现。原创 2024-04-21 05:42:44 · 319 阅读 · 0 评论 -
12.3、终止线程执行(3 种方法)
● C 语言中,return 关键字用于终止函数执行,必要时还能将函数的执行结果反馈给调用者。● return 关键字不仅可以用于普通函数,线程函数中也可以使用它。原创 2024-04-21 05:41:49 · 634 阅读 · 0 评论 -
12.2、创建线程
pthread_create()函数声明在头文件中,语法格式:原创 2024-04-21 05:40:28 · 352 阅读 · 0 评论 -
12.1、线程介绍
● 现代软件系统中,除了进程之外,线程也是一个十分重要的概念。● 线程一词于 1967 年左右首次提出,是计算机硬件和软件发展过程中诞生的产物。原创 2024-04-21 05:35:56 · 907 阅读 · 0 评论 -
11.11、变量的存储类别和生存期
● 变量是有数据类型的,用以说明它占用多大的内存空间、可以进行什么样的操作。● 除了数据类型,变量还有一个属性,称为 “存储类别”。原创 2024-04-20 11:30:00 · 889 阅读 · 0 评论 -
11.10、野指针、非法内存操作、内存泄露(内存丢失)
如果一个指针指向的内存没有访问权限,或指向一块已经释放掉的内存,那么就无法对该指针进行操作,这样的指针称为野指针(Wild Pointer)。原创 2024-04-20 10:30:00 · 933 阅读 · 0 评论 -
11.9、动态内存分配
静态内存分配:在进程的地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好,它们大小固定,不能由程序员分配和释放,只能等到程序运行结束由操作系统回收。原创 2024-04-20 10:00:00 · 844 阅读 · 0 评论 -
11.8、栈
● 程序的虚拟地址空间分为多个区域,栈(Stack)是其中地址较高的一个区域。● 栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的用途就是完成函数的调用。原创 2024-04-20 08:30:00 · 856 阅读 · 0 评论 -
11.7、用户模式、内核模式
进程(Process):一个可执行程序就是一个进程,使用 C 语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间。原创 2024-04-20 06:30:00 · 540 阅读 · 0 评论 -
11.6、程序的内存布局(内存模型)
● 虚拟地址空间在 32 位环境下的大小为 4GB,在 64 位环境下的大小为 256TB。● 一个 C 语言程序的内存在整个地址空间中如何分布?数据在哪里?代码在哪里?为什么要这样分布?原创 2024-04-20 04:30:00 · 721 阅读 · 0 评论 -
10.5、MMU 部件、内存权限控制
通过页表完成虚拟地址和物理地址的映射时,要经过多次转换,还要进行计算,如果由操作系统来完成这项工作,那将会成倍降低程序的性能,得不偿失,所以这种方式是不现实的。原创 2024-04-20 03:00:00 · 251 阅读 · 0 评论 -
11.4、内存分页机制、内存共享
关于虚拟地址和物理地址的映射有很多思路,可以假设以程序为单位,把一段与程序运行所需要的同等大小的虚拟空间映射到某段物理空间。例如:原创 2024-04-20 01:00:00 · 984 阅读 · 0 评论 -
11.3、内存对齐,提高寻址效率
计算机内存以字节(Byte)为单位划分,理论上 CPU 可以访问任意编号的字节,但实际情况并非如此。原创 2024-04-20 00:30:00 · 473 阅读 · 0 评论