- 博客(173)
- 收藏
- 关注
原创 五种IO模型与阻塞IO
fds:指向pollfd结构体数组的指针nfds:要监控的文件描述符数量timeout:超时时间设置pollfd结构体int fd;/* 文件描述符 *//* 请求监控的事件 *//* 返回的就绪事件 */
2025-06-11 16:52:57
623
原创 内网穿透,代理服务,NAT
frp是一个高性能的内网穿透软件,它能够帮助你通过一个处于内网的机器(客户端)将本地服务器的服务端口映射到一个处于外网的机器(服务端)上,从而可以让外网用户通过服务端访问到内网的服务器。
2025-05-28 17:14:44
870
原创 数据链路层
以太网是一种技术标准,而不是一种具体的网络,即包含了数据链路层的内容,也包含了一些物理层的内容。以太网是当前的最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等。
2025-05-27 23:39:37
901
原创 网络层IP协议
TCP作为传输层控制协议,保证的是数据传输的可靠性和传输效率,但TCP提供的只是输出传输策略,负责数据传输的是网络层和链路层。进行网络通信时,发送的数据并不是直接从一方的传输层到另一方的传输层,需要向下传输,经过封装到网卡发送出去,对方网卡接收到信息向上处理,进行拆包操作得到数据。网络层有能力将数据发送到对端,网络层不能保证数据是否成功送达,所以就需要有传输层来定制策略保证数据送到对端。
2025-05-24 20:29:46
1170
原创 MySQL索引
索引:提高数据库的性能,不用加内存,修改程序,调sql,只要执行正确的create indx,查询速度就会提高非常多,但是也会带来缺陷,会降低插入,更新和删除的速度,这些写操作,增加了大量的IO。索引唯一价值就是提高了查询的速度。主键索引(unique)唯一索引(unique)普通索引(index)全文索引(fulltext)下面代码可以创建出海量的数据表-- 构建一个8000000条记录的数据-- 构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解。
2025-05-09 12:27:59
895
原创 HTTPS协议原理
数据摘要,基本原理就是用单向散列函数对信息进行运算,生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以判断数据有没有被修改,因为文本被修改,那么出现用单向散列函数的出来的固定长度数字摘要与原来差别很大,就能判断是否被修改了。摘要常见算法:有MD5SHA1SHA256SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)摘要特征:摘要的不是用来加密,因为没有有解密,很难从摘要反推原文信息,通常用来进行数据对比。
2025-05-04 11:40:27
642
原创 HTTPcookie与session实现
(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。工作原理。
2025-05-03 12:16:02
1293
原创 Mysql数据类型
表的编码是utf-8时,varchar(n)的参数n最大值为65535/3=21844,因为utf中,一个字符占用3个字节,如果编码是gbk,varchar(n)的参数n最大值是65535/2=32766(gbk中,一个字符占用2个字节)。下图可知,同样位数的decimal和float,float已经不准确了,而decimal是准确的,float精度大约是7位,decimal整数最大位数为65,支持小数最大位数d是30.d被省略,默认为0,m被省略默认为10.而且出于效率 考虑,这些值实际存储的是“
2025-04-29 21:02:39
650
原创 HTTP协议重定向及交互
将客服端的请求从一个URL转发到另一URL,就是本来要去超市买东西,结果上面挂了个牌子说在另一半开,就要去另一边买,不再是原来的地方买东西。
2025-04-29 09:46:07
1518
原创 应用层协议HTTP
FileSize函数创建一个in的输入流文件对象,从文件中读取数据,std::ios::binary标志表示以二进制模式打开文件,再二进制模式下,文件的字节不会被转换或解释,而是直接读取,seekg函数把文件的位置指针移动到文件的末尾,tellg函数是回去当前文件流位置指针的位置,也就是文件的大小(一个字节距离,总距离就是表示有多少个字节),seekg函数把位置指针移到最后,然后用tellg函数得到当前位置的大小就可以获取到文件的大小了。客服端通过HTTP协议向服务器发送请求,服务器收到请求后处理并响应。
2025-04-27 17:06:52
1215
原创 Linux网络进程守护化
会话 ID 是会话首进程的进程组 ID。因为会话首进程总是它所在进程组的组长,所以会话 ID 和会话首进程的进程组 ID 是相同的。
2025-04-24 08:56:50
966
原创 Linux实现网络计数器
类TcpServer的私有成员变量有端口号,指向类Socket对象的指针,布尔值表示是否运行,以及回调函数,ioservice_t是表示参数为指向Socket对象的指针和InetAddr对象的函数,TcpServer类的构造函数接收端口号和回调函数的实现,会指向Socket类的一个函数方法,要传入端口号作为参数,
2025-04-23 17:33:06
1116
原创 TCP实现多线程远程命令执行
bind的绑定第一个是对象,其余的都是参数,传给一个类需要this指针,所以有&r错误地方是智能指针的参数要加&,thread.name()要删除 :这是一个指向以空字符结尾的字符串的指针,该字符串包含要执行的命令。这个命令可以是任何可以在命令行中运行的命令。:这是一个字符串,指定管道的方向。它只能是以下两种模式之一::表示从子进程的输出中读取数据。:表示向子进程的输入中写入数据。2. 参数解释: 是一个 对象, 是一个成员函数,它返回一个指向以空字符结尾的字符串的指针。这个指针可以直接传递给 函数。:
2025-04-16 19:03:08
895
原创 LinuxSocket套接字编程
domain:指定协议族,如AF_INET(IPv4)或AF_INET6(IPv6)。type:指定套接字类型,如SOCK_DGRAM(UDP)或(TCP)。protocol:通常设置为0,表示使用默认协议。:成功时返回一个套接字描述符,失败时返回-1。
2025-04-09 20:57:09
787
原创 C++类型转换
隐式类型转换,也叫自动类型转换,编译器默认进行的类型转换行为,使得两个变量的数据类型一致。// 1.23 是 double 类型,先隐式转换为 int显示类型转换就是手动进行数据转换,进行强制的从一个类型到另一类型,在指定类型的变量前加上数据类型。类型转换的问题类型转换不是一定安全的,会出现错误。并不是任意类型之前都⽀持转换,两个类型⽀持转换需要有⼀定关联性,也就是说转换后要有⼀定的意义,两个毫⽆关联的类型是不⽀持转换的常见的隐式类型转换错误。
2025-04-07 15:41:54
783
原创 C++IO库
IO的操作过程中,可能会发生各种错误,IO流对象中给了四种状态标识错误。goodbit表示流没有错误;eofbit表示流到达文件结束;failbit表示IO操作失败;badbit表示崩溃了出现了系统级错误。一个常见的IO流错误就是cin>>i,i是一个int类型对象,如果在控制台输入一个字符,cin对象failbit状态位就会被设置,cin进入错误状态,一个流一旦发生错误,后续的IO操作都会操作失败,可以调用cin.clear()函数恢复cin的状态为goodbit。
2025-04-07 01:33:27
973
原创 C++多线程编码二
lock是一个函数模板,可以支持多个锁对象同时锁定同一个,如果其中一个锁对象没有锁住,lock函数会把已经锁定的对象解锁并进入阻塞,直到多个锁锁定一个对象。try_lock也是一个函数模板,尝试对多个锁对象进行同时尝试锁定,如果锁对象全部锁定,返回-1,如果某一个锁对象尝试锁定是失败,把已经锁定成功的锁对象解锁,并返回这个对象的下标(第一个参数对象,下标从0开始)
2025-04-06 13:26:16
966
原创 C++多线程函数介绍
对于多线程操作,Linux选择使用POSIX标准,而windows没有选择POSIX标准,自己设计了一套API和系统调用,叫Win32 API,就跟Linux存在标准差异,在Linux的代码移植到Windows就可能运行不了。要保证兼容性,就需要借助条件编译,实现两份代码,根据不同平台执行对应的代码。// 确保平台兼容性CreateThread // Windows 中创建线程的接口// ...#elsepthread_create // Linux 中创建线程的接口// ...
2025-04-04 21:08:58
862
原创 Linux网络基础三
端口号是传输层协议的内容,端口号的类型是2字节的16位的整数,端口号是用来标识一个进程,使操作系统知道当前这个数据要交给哪一个进程处理。IP地址+端口号能够标识网络上的某一台主机的某一个进程,一个端口号只能被一个进程占用。TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议,简单来说,它就像是一个非常负责任的快递员,要确保货物(数据)能够完整无误地从发送方送到接收方。特点:1.面向连接:在数据传输之前,TCP需要建立一个连接,就像打电话一样,先拨号,对方接听后,才能开始交流。
2025-04-04 15:30:36
1190
原创 动态规划-解码方法
题目分析:根据提供的字符串s进行解码,A到Z对应1到26,s里面都是字符形式的数字,解码方式有两种形式,一是单独,而是组队只能两个组队,就会形成多种解码方法,计算出所有的解码次数。
2025-04-02 18:34:53
342
原创 网络基础二
以太网解释上面例子:局域网内某台主机(老师)发送了信息,经过多层协议进行封装,在进行网络通信的时候,这个局域网内的其它主机都收到了封装的信息,都会对信息进行解包,根据发送的信息里面带有的报头进行比较(是不是张三),比对成功继续解包分用,对比不成功就丢弃信息。IP地址是在IP协议中,用来标识网络中不同主机的地址,对于IPv4来说,IP地址是一个4字节的,32位的整数,通常也用点分十进制的字符串表示IP地址,例如192.168.0.1,用点分割每一个数字表示一个字节,范围是0-255。
2025-04-02 14:57:26
1060
原创 Linux网络基础一
在快递单号上填的相关信息在计算机看来都是属性,而属性在计算机中使用结构体来描述的,所有的协议都是在计算机上提前设定好,传输的双方也都是认识相关属性的结构体。网络呈现层状是英文网络通信的项目规模一般非常大,同时问题也是层状的,每一层的问题都要通过不同的协议来解决,所以网络也是层状的。计算机生产商很多,计算机系统也很多,计算机网络设备繁多,就需要一个共同的协议来通信,让所有的都遵行这个协议,这就是网络协议,两台主机之间的约定协议就是网络协议的标准的一个子集,只是一不部分。传输层:负责两台主机之间的数据传输。
2025-03-31 13:47:35
484
原创 Linux线程池实现
开始是把线程名字放到name里面,进到循环里面,要加锁保证sleepernum值不会因为并发而改变,循环里面第一个循环只有任务队列为空且线程是运行才会进到等待队列进行休眠,sleep值是计算休眠的个数,判断是线程不运行且任务队列为空就退出了,没退出就说明有任务,就取出队列的任务给t,最后就可以t()执行任务。总结来说,即使在多线程环境中,由于类加载和静态初始化的同步机制,以及静态变量的可见性保证,立即实例化的单例模式可以确保在任何时候都只有一个实例被创建,从而保证了线程安全。
2025-03-30 21:02:06
760
原创 C++实现布隆过滤器
位图虽然能高效且节省存储数据,但是类型必须是整型,不能存储其它类型。布隆过滤器是由布隆提出的一中紧凑型,比较巧妙的概率型数据结构,特点是高效的插入和查询,可以得知什么是一定不存在或者可能存在的。它是用多个哈希函数,将一个数据映射到位图结构中。这种方式可以提升查询效率,且节省大量内存空间。布隆过滤器的思想就是把key先映射成哈希整型值,在映射一个位,但只有一个位,出冲突率就会比较多,可以通过多个哈希函数映射多个位,降低冲突率。
2025-03-29 22:21:30
1040
原创 Linux日志实现
在C++中,`=0`用于纯虚函数(pure virtual function)的声明,表示该函数没有实现,必须由派生类(子类)提供具体的实现。这种语法用于定义抽象类(abstract class)中的接口函数。### 为什么可以用`=0`来声明纯虚函数1. **历史原因**在C++的设计中,`=0`的语法来源于早期的C语言习惯。在C语言中,`0`通常表示“空”或“无”,例如空指针。C++的创始人Bjarne Stroustrup在设计纯虚函数时,选择了这种简洁且直观的语法来表示“没有实现”。
2025-03-29 14:30:32
1544
原创 Linux信号量
在生产者消费者模型中,共享资源q是被看成了一个整体来使用的,就需要加锁来确保安全性。而有时整个资源对一个线程来说过于大了,是否可以拆分呢?,是其切分成多块使用,分给更多的线程去使用这些切分的资源,就可以让线程并发的执行任务。但是也要保证数据安全,避免多线程并发导致数据不一致的问题,还需要解决容量问题,要是更多的线程进来怎么办,不够分。所以未来更好的保护临界资源的问题就需要引用信号量进来,信号量可以解决定最多有多少个线程进来。
2025-03-27 16:02:06
664
原创 C++位图
给40亿个不重复的无符号整数,无排序。给一个无符号整数,如何快速判断一个数是否在40亿个数中。思路一:遍历全部,时间复杂度为O(N),太慢了。思路二:排序再加上二分查找。时间复杂度为O(N*logN)+O(logN)但是思路二对于大量数据还是不合适,1G=1024MB=1024*1024KB=1024*1024*1024Byte。约等于10亿多Byte,40亿就需要大约16G,内存放不下那么多数据,只能在硬盘文件存放。而二分查找只能对内存数组中的有序数据进行查找。
2025-03-27 00:33:15
298
原创 二叉树的非递归
后序是先左子树,再右子树,最后根的。那么要想把值放入vv里,就需要左右都遍历才可以,每个结点看成根,叶子的是两个空的根,先把所有的左节点放入栈里面,然后取出一个,判断这个结点的右结点是否为空,空就说明右结点不用遍历,那么就可以把这个根的值插入vv里了,接着把栈顶的数据排出,要确保插入了值才能pop掉,这里不用管左的,因为再循环里就已经走到最左边了。根的访问顺序是中间的,因为叶子结点的右结点肯定是空的,就会去左节点的父亲结点,也就根,然后放到vv里面,再进入到右结点里面。
2025-03-24 15:13:39
318
原创 Linux线程同步
有一个VIP自习室,只能有一个人进去,墙上挂着一把钥匙可以开门,张三第一个拿到钥匙进去了,学到了中午,肚子饿了想要出去吃饭,开门把钥匙挂在了墙上,然后发现很多人在外面排队等着进自习室,他就忍者肚子饿又把钥匙拿了下来,因为离着近,学了一会忍不住又把钥匙放到外面想吃饭,但是放完后又拿了下来进去了,就一直重复这个事情。外面的人想要拿到钥匙进去,但是张三离的近,竞争力很强,频繁的申请钥匙,就会导致外面的人长时间得不到锁资源,导致饥饿问题。所以锁分配的不够合理,就任意导致饥饿问题的发生。
2025-03-24 02:23:24
644
原创 数据结构二叉树进阶
开始前就可以判断是否有结点是祖先,然后构建函数判断是否在左边,而右边函数就可以不用写了,因为不是左就是右,得到两结点的方位值(true为左,false为右),就可以用来走判断了,如果是一左一右那么就返回这个结点,反着也是,接下来是同左边,就要递归了,因为要用一左一右和其中一个为祖先来找,同右也是,只是用来移动位置来触发一左一右和有一个为祖先的情况。q为4结点,先入35,然后6入,但是因为没有目标结点在6的左右子数就踢出去,到2,到7,而7也是跟6一样踢出去,就到4了找到并返回。
2025-03-22 16:13:38
885
原创 Linux线程控制封装及线程互斥
fn:子进程或线程的入口函数child_stack:子进程的栈地址,通常需要手动分配,栈的大小需要足够容纳子进程变量的局部变量和函数调用。flags:控制子进程或线程共享哪些资源(如内存、文件描述符等)。CLONE_VM:共享内存空间。CLONE_FS:共享文件系统信息。:共享文件描述符。:共享信号处理机制。:让子进程成为与父进程同一线程组的线程。:创建新的 mount namespace。:创建新的 UTS namespace,用于隔离主机名。arg:传递给fn的参数。
2025-03-21 15:59:07
1550
原创 Linux线程控制二
retval:线程退出时返回的值。这个值可以被其他线程通过函数获取。该函数不会返回,因为它的作用是终止调用它的线程。一旦调用,调用它的线程就会结束执行。注意:当线程调用pthread_exit退出后,它的资源(如线程栈)并不会立即释放,要释放这些资源,必须通过pthread_join或者pthread_detach来完成,如果线程是分离状态(pthread_detach设置),那么线程退出资源后会自动释放。:这是线程的入口函数。每个线程的执行都从这个函数开始。arg是传递给线程的参数。:将传入的参数。
2025-03-20 12:58:08
1031
原创 动态规划-使用最小花费爬楼梯
题目分析初始可以选择第一个或者第二个,也就是下标为0和1位置的阶梯,如果还要往下跳就要缴费,费用就是cost数组的元素,阶梯下的数字就是cost数组的下标,对应的元素就是费用,要求出最小费用到最终点。
2025-03-18 19:28:21
428
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人