- 博客(135)
- 收藏
- 关注
原创 拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗?+ 客户端宕机/杀死进程,TCP会如何?
拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗?客户端宕机/杀死进程,TCP会如何?
2022-09-28 12:00:48
772
原创 go-grpc TSL认证 解决 transport: authentication handshake failed: x509 certificate relies on ... ...
go-grpc TSL认证 解决 transport: authentication handshake failed: x509 certificate relies on... ... go-grpc基础通信上加上TSL认证
2022-08-05 20:20:37
3475
原创 LRU淘汰缓存机制(LRU页面置换算法)HashMap+双向链表 C++实现
LRU淘汰缓存机制(LRU页面置换算法)HashMap+双向链表 C++实现
2022-08-04 23:03:58
308
原创 windows go环境 搭建 go-grpc
windows go环境 搭建go-grpc1、go环境安装2、下载并配置protoc.exe3、安装protobuf和grpc解决:go get: module github.com/golang/protobuf/protoc-gen-go: Get... ...go: module github.com/golang/protobuf is deprecated: Use the ... ...go install: google.golang.org/protobuf/cmd/pro.
2022-07-08 14:29:00
1360
3
原创 电路交换和分组交换
一、电路交换在电话问世不久以后,人们就发现要让所有的电话机都两两连接是不现实的,两部电话只需要一根电线连接,但是5部电话两两互连就需要10根电线,N部电话就需要N(N-1)/2根电线,于是人们将每部电话都链接到交换机上,当电话数量增多就使用很多彼此连接起来的交换机来完成全网的交换任务。电话发明以来电话交换机虽然经过多次的更新换代,但交换的方式一直都是电路交换。交换就是按照某种方式动态地分配传输线路的资源。在使用电路交换通话之前必须先拨号请求建立连接。当被叫用户听到交换机送来的振铃音并摘机后,从主叫端到
2022-04-08 20:04:10
4266
原创 已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数,bitmap实现代码。
部份内容参考于:https://blog.csdn.net/gamesofsailing/article/details/18001703一定要好好读题,我第一次理解这个题其实理解错了,我以为是求不同号码的每个的个数,后来读了好多遍题,对不起,我的问题,bitmap只能确定这个号码是不是在,是那么对应的bit位为1,不是为0,我们统计所有bit位的1的个数就是不同号码的个数。每个号码8位,最多就有99999999个号码,需要99999999个bit位来表示这些号码,大约是125000000个字节,想要
2022-03-18 19:19:26
982
原创 进程基础3 --- 进程源语wait,进程源语waitpid,僵尸进程,校验子进程退出
一、僵尸进程 Zombie Process1、父子进程模型中,子进程先于父进程结束,父进程必须回收子进程资源(PCB),否则会产生内存泄漏。(僵尸进程)2、为什么用户空间会被内核回收,而PCB不会,子进程PCB要留给父进程回收,子进程退出的详情保存在PCB中,父进程需要知道子进程的具体因为什么退出(死后验尸QAQ),子进程PCB回收只有父进程能做。(linux强亲缘关系)3、僵尸进程的危害1)僵尸进程有比较大的内存泄漏危害。(PCB是庞大的结构体,内部成员众多,许多成员还额外占用内存空间)2)僵尸
2022-01-16 13:23:56
631
原创 进程基础2 --- 进程源语fork版本变更,进程源语exec
一、FORK的版本变更1、第一版本fork采用不过问原则, 只要创建出子进程,内核就要以父进程为模板对子进程进行初始化。(0-3G用户空间直接复制 , 3-4G内核空间复制一部分,生成一部分)第一版的缺陷:内核花费了大量精力对子进程进行初始化,但是如果子进程没有使用任何的继承资源,内核的拷贝与克隆变得毫无意义。(反而变成了系统资源的浪费)2、第二版vfork , 避免克隆资源没有被使用,产生无意义的克隆开销,vfork决定砍掉克隆拷贝功能, 开发者需要自行填充进程的核心功能 vfork + exec
2022-01-16 10:50:33
265
1
原创 进程基础1 --- 进程源语fork
一、进程源语系统提供的进程相关API完成多进程开发。fork 进程创建, exec 进程功能重载 ,wait 进程回收,waitpid 进程回收。 (wait函数的升级版)二、fork1、fork的英文原义是叉子,用叉子的形状表示进程关系。父进程调用fork,通知内核帮我创建一个进程。2、fork函数fork的核心功能:1)_CREAT(进程创建) 只是一个空壳2)_CLONE(克隆,进程初始化) 将父进程的资源继承拷贝给子进程pid_t pid; //进程pid类型,用户存储进程
2022-01-16 00:11:08
651
原创 error while loading shared libraries,error MISCONF Redis is configured to,redis get中文乱码
1、运行程序链接hiredis出现错误error while loading shared libraries:libhiredis.so.0.13: cannot open shared object file: No such file or directorybirdbird@birdbird-virtual-machine:~$ sudo su[sudo] birdbird 的密码: root@birdbird-virtual-machine:/home/birdbird# vi /etc
2022-01-10 23:18:46
533
原创 正则技术1 --- 正则表达式
一、基本概述用户要在某个数据集中匹配并抽取一些特殊或关键数据可以使用正则表达式技术, 主要用途就是模式匹配, 比系统提供的str标准字符串处理函数功能强大并且效率更高 , 因为str系列函数采用ASCII码逐字符偏移比较的形式查找修改字符数据,但是REGEX正则采用贪心算法进行匹配查询。二、正则语句格式正则语句是由一组匹配字符+特殊符号(元字符)构成的字符串 ,该字符串用于描述要匹配数据的数据规则, 最后根据正则语句进行模式匹配,获取关键内容。三、数据规则正则表达式是批量匹配与提取技术, 使用者必
2022-01-10 23:07:59
605
原创 网络爬虫4 --- 百科词条爬虫 (爬取的关键要素:每个词条的词条名、词条描述、词条链接)
百科词条爬虫一、爬取的关键要素每个词条的词条名、词条描述、词条链接。二、爬取词条,如何存储?1、cname标签,description标签,url标签, 爬取以后使用这种格式存储,方便我们使用,可以用正则表达式匹配出我们需要的内容。2、词条数据存储格式<cname>词条名</cname> <description>词条描述</description> <url>词条链接</url>三、词条爬虫的工作模式1、种子UR
2021-12-31 22:36:14
1331
原创 网络爬虫3 --- 编写代码将https的图片下载到本地
一、我们用应对HTTP的策略来应对HTTPS一定是行不通的,HTTPS除了与服务器进行基本的连接以后,还需要与服务器进行一个安全认证,只连接不认证是无法获取到资源的。认证基于连接,先连接再认证。二、OPEN_SEEL库1、我们需要第三方OPEN_SEEL库来帮助我们认证。openssl安装sudo apt-get install libssl-doc #openssl文档 sudo apt-get install libssl-dev #openssl库2、使用openssl编译时需要链接库
2021-12-31 10:18:14
393
原创 网络爬虫2 --- 用代码实现将一张http图片下载到本地
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/socket.h>#include<arpa/inet.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<netdb.h&g
2021-12-31 01:13:04
947
原创 网络爬虫1 --- Web相关知识、Web网络资源请求与响应过程、HTTP协议的请求与响应
一、网络爬虫是一个软件应用,可以自动化批量获取网络资源 (网络资源下载器),网络爬虫工作于万维网(模拟浏览器行为),万维网是由无数网页+WEB服务器构成的庞大网络资源存储仓库 ,万维网是网络用户获取数据的主要渠道。二、爬虫爬取的网络数据用途 :数据分析,数据挖掘,搜索引擎(数据)(各大网站 搜索 我们搜索 一般都会有各种 然后转到相应的网站 搜索引擎爬他们 然后 我们搜索 反馈给我们),数据可视化(某app的用户数据给别人看 比如做出地图图示 某地 多少人 年龄),AI训练数据集(比如辨认男女),但是
2021-12-31 01:08:22
1183
原创 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的。一、POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO。按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧。二、IO模型这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会从用户进程空
2021-12-24 21:44:33
249
原创 Linux服务器8 --- 多路IO复用+线程池服务端模型代码及运行截图
代码:https://github.com/Birdbird-66/BirdBird-A.git运行截图:
2021-12-24 15:04:07
616
原创 边缘触发模式+非阻塞读取网络IO
测试扩容:原来业务处理读取数据是if,改成while,如果有数据发送读取完毕就会阻塞,一个线程绑定一个客户端,这样就会导致线程一直被占用。测试完扩容以后,用不用改回来?不改回来导致线程被占用。if读一次也不是一件好事 ,recv读我们规定的大小 ,如果读不完怎么办,网络情况变换莫测,可能我们想读500字节,实际上只读取了300字节,且边缘触发模式,clientfd就绪,就发送一次通知,读不读,读没读完,无法确定。肯定不能读一次 ,采用边缘触发模式+非阻塞读取网络IO。边缘触发是因为只希望当某个sock
2021-12-24 14:47:55
1573
原创 EPOLL水平触发模式(EPOLLT)和EPOLL边缘触发模式(EPOLLET)
epoll+线程池高并发服务器模型在测试的时候产生bug。bug1:一个客户端连接,服务器却添加了多次业务。bug2:很多消费者线程被占用 ,导致消费者线程扩容。1、客户端一次请求,服务端却添加多次业务?采用epoll监听socket的网络事件,某一时刻serverfd事件就绪 ,serverfd就会变成就绪态socket,需要处理serverfd上的事件,处理就绪的serverfd。clientfd就绪同理。无论是serverfd还是clientfd,变成就绪态的socket,我们一定要处理完就绪
2021-12-23 22:46:02
2937
4
原创 Linux服务器7 --- 多路IO复用+线程池服务端模型(高并发)分析
一、服务端特性概述1、使用EPOLL模型在服务器中加入(网络IO监听,大量的监听能力)EPOLL采用边缘触发模式(后话)2、线程池模型进行并发处理业务(并发处理能力)1)提高线程重用性(避免频繁创建销毁线程)。2)线程管理能力较强(根据需求扩容缩减)。3)预创建处理线程,可以更为及时有效地为客户端服务。3、不要让处理线程与客户端绑定(影响并发),处理线程可以重用为不同的客户端服务。4、不要让线程池与业务绑定,使用者自行定义实现业务并传递给线程池, 线程负责执行即可。5、服务端任务传递采用生
2021-12-23 11:45:12
1432
原创 修改Linux下进程使用描述符数量
步骤一:首先查看系统最大可用文件描述符数量cat /proc/sys/fs/file-max步骤二:通过修改系统配置文件,变更进程使用描述符数量sudo vi /etc/security/limits.conf //根据需求更改系统限制* soft nofile 最小描述符使用数量* hard nofile 最大描述符使用数量修改完成后保存退出并重启系统,此修改永久有效。...
2021-12-22 13:30:03
676
原创 Linux服务器6 --- EPOLL模型函数接口,服务端代码,工作流程及其优缺点
添加头文件#include<sys/epoll.h>#include<SOCKET_API.h>#define SERVER_IP "127.0.0.1"#define SERVER_PORT 8000#define BUFSIZE 1500#define TIMEOUT 1#define BACKLOG 128#define SETSIZE 1024#define EPOLLSIZE 200000int main(){ //网络初始化 struct s
2021-12-22 12:36:38
606
原创 Linux服务器5 --- POLL模型优缺点及服务端代码
POLL模型大体实现流程上与SELECT模型无异1、POLL模型的利弊优点:1)单进程让服务端拥有基本的一对多响应能力。2)实现较为简单(模型比较轻量)3)POLL模型突破了1024的监听限制 , POLL没有使用fd_set , 而是允许用户自定义长度监听集合数组。( 一定要考虑轮询问题 ,轮询问题依然存在)4)POLL将传入监听事件与传出就绪事件进行了分离,用户使用方便。5)与传统的SELECT设置监听方式不同,SELECT采用批处理方式进行监听设置,但是POLL允许对集合中不同的SOC
2021-12-21 21:05:09
661
原创 Linux服务器4 --- select模型服务端代码及select模型的利弊
#include<SOCKET_API.h> //在SOCKET_API.h中添加select头文件/*宏定义*/#define SERVER_IP "192.168.27.128"#define SERVER_PORT 8000#define BUFSIZE 1500#define TIMEOUT 1#define BACKLOG 128int main(){ /*网络初始化*/ struct sockaddr_in serveraddr,clientaddr; bz
2021-12-21 17:56:47
470
原创 Linux服务器3 --- 多路IO复用技术 --- select(单进程服务端模型使用select实现一对多处理)讲解
多路IO复用技术可以监听多个网络IO上的网络事件,网络IO,一个socket就相当于一个网络IO,网络事件,网络IO上发生的读事件,写事件,异常事件等。单进程服务器模型两个主要模块发生冲突导致我们只能实现一对一的处理,如果单进程模型加上IO复用技术,就可以实现一对多处理效果。1、accept 函数是阻塞函数,为什么阻塞?第一个参数是serverfd,阻塞在serverfd这个socket上等事件,listen监听serverfd这个网络IO上的事件,比如读事件或者写事件,什么时候会触发读/写事件,别人给
2021-12-21 11:17:46
705
原创 Linux服务器2 --- 多进程服务器并发模型---僵尸进程回收问题
多进程并发服务器模型,子进程结束产生僵尸进程,需要回收,僵尸残留。(PCB残留)1、谁来回收?怎么回收? 父进程回收,当子进程退出时,内核会给父进程发送一个信号SIGCHLD。(默认忽略)只有父进程回收,但是父进程又不能回收,什么意思呢 ?我们单进程的服务器模型不能一对多的主要原因就是接收连接模块和业务处理模块二者发生冲突。我们二者分离开,分别放在两个进程中,父进程等待连接,子进程任务处理。但是现在又来了一个新的业务,回收模块,如果都让父进程去完成,而且回收是默认阻塞回收,回收模块就又会和建立连接模块发生
2021-12-20 20:40:14
616
2
原创 Linux服务器1 ---(常用的套接字API函数的二次包裹,简单的单进程模型,简单的多进程/多线程模型支持并发)
一、常用的套接字API函数的二次包裹对套接字api函数进行包裹,内部加入错误处理,功能与系统的api函数完全相同 ,为了我们容易寻找错误且使用方便。1、socket套接字函数包裹定义#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#inclu
2021-12-11 17:31:40
533
原创 服务器基础 :服务器的特性与任务、服务器常见问题与解决方案、代理服务器(高可用性(心跳机制)+负载均衡(3种算法))、如何保证高效长连接
服务器在网络中为网络用户提供数据信息,资料文件等等 , 大多数企业服务器是internet中的一个数据仓库, 这个时代纯粹的单机应用很少见,几乎所有的软件应用有服务器做支撑,可以一对多处理若干用户请求, 服务器是互联网重要组件。一、服务器种类1、WEB服务器(HTTP服务器)常见于经典的BS架构中,浏览器/web服务模型 ,是互联网中最常见也是使用最频繁的服务器 , 提供了大量的网站资源, 门户网站,搜索引擎 , 视音频网站等等…2、邮件服务器(Mail Server)所有邮件的收发中转都是利用M
2021-12-10 17:42:38
860
原创 Linux服务器之Socket套接字基础+简单实例(网络信息结构体、大小端转换函数、SOCKET() 、绑定 BIND()、LISTEN()、ACCEPT())
一、基本概述1、Socket套接字是系统提供用于网络应用开发的一系列Api接口 , 各个平台语言都有对Socket套接字的支持(兼容性跨平台能力强)。2、Linux系统下 everything its file ,所以将网络设备抽象成了文件,可以通过文件处理的方式操作访问socket进行网络通信。linux下将socket包裹成文件描述符 sockfd,它跟传统的文件描述符fd不同。传统的文件描述符fd指向磁盘io ,向磁盘中读写数据。sockfd指向网络io 向网络中读写,访问网络设备。只是借用文件描
2021-12-09 21:52:34
1336
原创 消息队列(定义、结构、如何创建、消息队列的发送与接收、发送与接收实例)
一、定义1、消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。2、多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除。二、结构1、消息队列中消息本身由消息类型和消息数据组成,通常使用如下结构:struct msgbuf { long mtype; char mtext[
2021-11-22 17:16:09
40044
原创 利用管道技术实现父子进程间通信(父进程以3秒为周期接收用户输入并发送到子进程)
利用管道技术实现父子进程间通信,具体流程:父进程以3秒为周期接收用户输入并发送到子进程,子进程接收到信息后显示并回传,父进程接收到回传信息后显示。父子进程在通信过程中采用信号中断处理方式进行处理,接收到“exit”字符串后父子进程均退出。(采用SIGUSR1或SIGUSR2信号)利用管道技术实现父子进程间通信,具体流程:父进程以3秒为周期接收用户输入并发送到子进程,子进程接收到信息后显示并回传,父进程接收到回传信息后显示。父子进程在通信过程中采用信号中断处理方式进行处理,接收到“exit”字符串
2021-11-22 13:38:38
2045
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人