- 博客(39)
- 收藏
- 关注
原创 传输层TCP/UDP
负责数据能够从发送端传输接收端端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);执行下面的命令, 可以看到知名端口号我们自己写一个程序使用端口号时, 要避开这些知名端口号。一个进程是否可以bind多个端口号?是一个端口号是否可以被多个进程bind?否netstat是一个用来查看网络状态的重要工具。
2024-04-23 22:25:07 744 1
原创 HTTP概述
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个。Header: 请求的属性, 冒号分割的键值对;Header: 请求的属性, 冒号分割的键值对;是一个网页的小图标,通常显示在浏览器的标签页上或书签栏中。在后续的博客中我们会实现一个简单的HTTP通信。
2024-04-19 15:38:38 916
原创 socket套接字编程
端口号(port)是传输层协议的内容我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程;此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?一个进程可以绑定多个端口号;但是一个端口号不能被多个进程绑定。传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要发给谁”;此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;
2024-04-18 20:59:05 1032
原创 linux网络预备
IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4。但是并不绝对. 很多交换机也实现了网络层的转发;TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。在这个例子中, 我们的协议只有两层;但是实际的网络通信会更加复杂, 需要分更多的层次。TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型。
2024-04-07 16:42:03 1090
原创 Linux线程
通过一定技术手段,将当前进程的“资源”,以一定的方式划分给不同的task_struct(PCB)。线程在进程内部执行(地址空间内部),是OS调度的基本单位(CPU不关系进程线程,它只关心PCB)。进程:承担分配系统资源的基本实体线程:OS能够进行运算调度的最小单位线程共享进程数据,但也拥有自己的一部分数据在linux下,线程没有单独的数据结构,线程与进程使用的都是task_struct。所以linux没有真正意义上的线程结构,linux是用进程PCB模拟线程的。
2024-04-02 14:51:53 826
原创 Linux信号处理
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 21 – 31为普通信号(非可靠信号)34 – 64为实时信号(可靠信号)本文只讨论普通信号。
2024-03-22 14:36:01 1273
原创 C++ 哈希
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数**(hashFunc)使元素的存储位置与它的关键码之间能够建立**一一映射的关系,那么在查找时通过该函数可以很快找到该元素。根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。
2024-01-10 00:30:37 794
原创 C++sting类常见用法
C++sting类常见用法函数使用作用capacity()s.capacity()函数返回的是字符串对象内部分配的缓冲区的大小,而不是字符串的实际长度。这个大小通常会超过字符串的长度,以便在进行字符串操作时有足够的空间来容纳潜在的增长clear()s.clear()置空empty()s.empty()检查是否为空返回boolsize()s.size()返回字符串的长度push_backs.push_back(‘!’)末尾插入一个字符a
2023-11-02 22:42:07 46
原创 C++模板初阶
是C++中的一种特性,允许你编写通用函数,可以处理不同类型的参数,而不必为每种数据类型都编写不同的函数。函数模板使用参数化类型(通常用T表示)来通用化函数的参数和返回值。注意: 注意函数模板本身并不是函数,而是一种用于生成函数的模板。函数模板是一种通用的函数模式,它定义了函数的结构和算法,但并不生成实际的可执行代码。它是一种参数化的描述,描述了如何生成函数,而不是实际的函数。这样我们在写Swap函数时,就不用重载多种类型了。
2023-11-02 13:15:36 25
原创 CC++内存管理
通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。以下是他们的使用详情。
2023-10-29 20:37:37 39
原创 C++赋值运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)以上代码包含了所有的常用运算符重载。
2023-10-29 20:36:25 33
原创 C++类和对象
sizeof(cc)的大小是12,成员变量在对象中,成员函数不在对象中 example: d1和d2的成员变量是不一样的,需要独立存储;但是每个对象调用的成员函数是一样的,用的是公共区域(代码段)。函数编译形成的指令存放在代码段(函数的地址就是代码段的地址),函数参数,临时变量存放在栈帧。那么问题来了,既然成员函数不在对象中,我们在初始化多个对象时,编译器怎么区分不同的对象调用函数?
2023-10-29 18:17:15 40 1
原创 # C++入门
命名空间(Namespace)是一种用于避免命名冲突和组织代码的机制。命名空间允许你将相似或相关的类、函数、变量等元素分组在一起,以便在不同部分的代码中使用它们而不会发生命名冲突在C++的std标准库中,如果我们直接使用using namespace std;我们在写代码声明变量时,会不可避免地发生命名冲突。所以我们通常不使用using namespace std;而是使用来声明某些常用的内容,其余内容用str::访问。
2023-10-29 17:55:57 38 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人