常用知识点
文章平均质量分 58
yun6853992
走在不知道到知道,知道到懂得,懂得到做到,做到到试图分享的路上。
感激每一个对我提出问题的人,感谢每一个善意鼓励我的人。
展开
-
日常知识点之阿里云服务器提示禁用了密码登录方式
使用阿里云服务器进行一些实例测试时,发现业务启动后,服务器连接卡死,重连显示拒绝密码登录。尝试好几次,因为在做的业务,怀疑可能时磁盘或者内存导致,但是,这玩意为啥会导致拒绝密码登录也是迷糊,就探索探索。查看虚拟机监控,发现是云盘读写bps占满,结合百度说内存满了设置交换分区就好了,试了试果然解决。如下,出现问题时查看监控:我的虚拟机安装的是ubuntu,直接百度设置交换分区,一次解决。因为是回顾昨天的问题,也是直接问ai,给出交换分区设置方式:设置后,当前状态如下,问题解决启动正常。后来发现重启虚原创 2024-08-08 10:40:52 · 736 阅读 · 0 评论 -
日常知识点之遇到问题结构体按位构造协议时和期望不一致,研究记录一下
疑问:本想按照定义的结构给结构体赋值,发现赋值后期望结果和预期不一致。总结:其实核心还是按位处理,按位处理时是从低位往高位写。原创 2024-08-08 10:09:07 · 407 阅读 · 0 评论 -
vs2019测试sizeof(string)的长度是28
vs2019测试sizeof(string)长度是28笔记原创 2022-08-07 11:08:19 · 957 阅读 · 1 评论 -
日常知识点之编译运行时识别头文件目录或者链接库目录设置
最近在日常工作中,用自己的业务结合ZLMediakit的开源库做一些业务处理时,涉及到一些头文件和so链接的细节技巧,做汇总,以方便后面回顾。使用gcc/g++编译的时候,其实都已经有一系列默认的路径,在这些路径中去依次查找依赖的头文件,动态库等。我们需要使用的第三方的头文件和so,那么就有如下几种方案。0:在使用gcc编译的时候,直接使用-I 和-L紧跟链接路径。1:把这些头文件和so拷贝到操作系统特定的目录,或者代码的同级目录。 ==》这个不做讨论2:使用export设置相关的环境变量,使能识原创 2022-03-23 18:07:06 · 1566 阅读 · 0 评论 -
日常知识点之网络面试八股文(tcp,惊群现象,协程)
建立在一直学习的基础上,我总觉得对于下面的问题我能做出一些理解。但是我明白的知道,不做一做实际的整理或者测试,我的理解总有一种建立在理论之上,似懂非懂的感觉。结合百度,下面这些问题我按照自己的理解为自己做一些知识备份,如果有不对的知识点,请指正。。。0:总结把做以下梳理时,相关的理解写在前面。1:在整理listen和accept,以及半连接队列和全连接队列时,整理相关知识。listen后,开始三次握手,三次握手的过程中,内核协议栈会维持一个半连接队列和全连接队列。listen的参数backlo原创 2022-02-20 12:24:27 · 3426 阅读 · 0 评论 -
知识巩固源码落实之7:json协议使用cjson的构造和解析
网络传输中,数据交互也需要一些自定义协议,其实json就是最好用之一。使用cjson进行json字符串的构造,以及对其进行对应解析的测试代码。1:背景介绍JSNON作为一种轻量级的数据交互格式,易于阅读和编写,易于解析和生成。日常开发中对json的使用次数也越来越多。我常用的就是使用cjon以及jsoncpp对数据进行构造以及解析。cjson因为直接包含一个头文件和.c文件就可以使用,特别方便,这里整理一些使用cjson进行构造与解析的实例,做代码备份。2:测试代码2.1:构造json格式的原创 2022-02-15 22:22:53 · 1646 阅读 · 0 评论 -
知识巩固源码落实之6:c语言拼接字符串与切割字符串(strsep)代码
网络数据是以流的形式进行传输的(我们在构造客户端/服务端待发送数据时,肯定有特定的格式)。关于发送一次,一个包的完整性可靠接收(tcp的可靠传输,以及取数据的半包粘包问题)这里不关注,可以参考上文。这里的目的是:===》备份c语言字符处理相关方案===》备份自己在业务实现时,对字符串切割实现的一个接口(strstr,strcasestr,strsep,strtok,strdup相关接口)有如下几个细节可以关注:===》1:实现不同类型的数据拼接字符串的方案 (3.1)===》2:char**通原创 2022-02-15 17:36:25 · 2367 阅读 · 0 评论 -
知识巩固源码落实之5:http get异步请求数据demo(多线程+struct epoll_event的ptr)
1:背景介绍简单的实现一个客户端对http服务器的请求后,思考如果同时多个请求,如何有效的对代码进行设计,关注每个请求的回复。1.1:如果多个请求同时进行,异步实现http的特定是无连接的,一个tcp连接对应一个请求。===》基于这个特点,可以使用多线程,实现异步的架构===》线程1实现对http服务器的请求发送===》线程2实现关注服务器对请求的响应,如果不考虑长连接,可以考虑接收请求后断开连接。1.2:如何实现异步方案发送请求后,我们可以使用epoll对**可读事件(accept连接,r原创 2022-02-13 22:59:11 · 815 阅读 · 0 评论 -
知识巩固源码落实之4:http get同步请求数据demo
1:背景介绍http是基于C/S模式的,一直对如何实现http请求很疑惑。http的协议理论了解很多,却一直无从下手不知道怎么实现一个http的请求。作为一个http的客户端,请求服务器的一个消息,实现demo,做代码备份。1.1:协议简单了解这里实现一个http的get请求,获取对端服务器的响应进行打印,实现demo//http请求实际就是按照http协议,构造特定的数据,使用tcp进行发送 //请求行 请求头部 空行 请求数据 // GET %s %s\r\n resourc原创 2022-02-13 22:56:11 · 1020 阅读 · 0 评论 -
知识巩固源码落实之3:缓冲区ringbuffer
1:背景介绍:在日常业务开发中,使用缓冲区进行临时存储的业务场景也比较多,如tcp每个连接底层都维持一个发送缓冲区和接收缓冲区。实现一个ringbuffer,做代码备用。(可以考虑如何对ringbuffer进行扩大?)//实现ringbuffer,其实就是申请一块内存,对塞入数据和取出数据位置分别进行管理typedef struct RINGBUFF_T{ void * data; unsigned int size; unsigned int read_pos; //数据起始位置 un原创 2022-02-13 20:27:25 · 588 阅读 · 0 评论 -
知识巩固源码落实之2:tcp服务端接收处理半包和粘包
1:背景介绍1.1:在处理tcp连接接收数据时,要考虑recv时(读取数据时),数据的半包,粘包问题===》tcp是可靠的流式传输,意味着对于每个连接,tcp可以按顺序,可靠的接收到对端消息。===》理解:对于每个连接(fd对应五元组),tcp协议栈底层维持了一个发送缓冲区和接收缓冲区。=====》对于一个连接,对应的自己的接收缓冲区,一系列的数据,按顺序塞入在了缓冲区中,recv只是从中取数据。=====》对于recv取接收缓冲区数据,需要一定策略(1:可能一次取到多个包(粘包) 2:可能rec原创 2022-02-13 19:43:33 · 787 阅读 · 0 评论 -
知识巩固源码落实之1:tcp服务端epoll实现
1:背景描述tcp网络通信是日常业务常常会重复实现的业务功能===》相关的socket接口:socket,bind,listen,accept,send,recv都是我们很熟悉的===》相关的io多路处理方案:select,poll,epoll可以根据业务场景自己抉择使用===》但其实,简单tcp服务器实现过程中,总有一些细节需要关注,===》以及考虑到每次重新实现,多次重写,开始思考备份一些代码。。。。2:tcp的服务器源码demo(epoll监听客户端连接及业务处理)作为tcp的服务器,使原创 2022-02-13 19:41:21 · 1132 阅读 · 0 评论 -
日常知识点之内存泄露定位手段(c语言hook malloc相关方式)
日常闲听公开课,又是自己不会的一个知识点,做笔记整理:如何确定有内存泄露问题,如何定位到内存泄露位置,如何写一个内存泄漏检测工具?1:概述内存泄露本质:其实就是申请调用malloc/new,但是释放调用free/delete有遗漏,或者重复释放的问题。内存泄露会导致的现象:作为一个服务器,长时间运行,内存泄露会导致进程虚拟内存被占用完,导致进程崩溃吧。(堆上分配的内存)如何规避或者发现内存泄露呢?===》1:如何检测有内存泄露?(除了内存监控工具htop,耗时,效果不明显)===》2:如何定位原创 2022-01-16 18:14:29 · 3624 阅读 · 6 评论 -
日常知识点之c语言按行读配置文件,及行尾符CRLF导致的问题
1:知识点总结Unix每行结尾为"\n",Windows系统每行结尾是"\r\n"printf输出时,如果内部字段含有\r,会自动跳转到行首进行后续的输出。printf输出时,有时候一直不打印,是因为printf底层是有缓冲区的,要在终端输出要用换行。2:简单问题描述。行为:我在做一个读取配置文件并进行解析的简单demo,按行读取,使用=进行分割,对value值进行拼接。问题:按行读取后,printf打印一直无法理解,出现现象一直如下:例如: const char* test="mytes原创 2021-12-16 17:58:32 · 1453 阅读 · 0 评论 -
c语言获取终端输入字符串的函数scanf,gets,fgets
获取终端输入字符串scanf,gets,fgets获取终端中输入字符串,我们常用getchar(),scanf(),gets(),和fgets()函数实现,这里简单汇总一下: scanf() 函数可以获取到终端字符串,但是不能识别到空格字符,遇到空格会终止,空格后面的字符串会在缓冲区中,下次获取时会继续用。 gets()函数以回车字符进行标识,获取用户输入字符串以回车为终止符。 scanf和gets函数都是不安全的,如果目标字符串缓冲区无法存储我们输入的字符串,会导致段错误 fgets(原创 2021-11-24 11:09:28 · 7149 阅读 · 0 评论 -
计算机存储,字节分为大端和小端
1:认识对于一个int类型的数字,如int data=0x01234567; 最高位是0x01 最低位是 0x67大端存储: 高位字节排在内存的低地址,低位字节排在内存的高地址端 ==》符合我们的阅读小端存储:低位字节排在内存的低地址 高位字节排在内存的高地址端 ==》计算机电路先处理低位字节,效率较高2:demo//测试本机是大端还是小段:#include <stdio.h>#include <stdlib.h>#include <stri原创 2021-09-29 13:33:38 · 223 阅读 · 0 评论 -
位运算符&和>>配合给有位域的结构体赋值
在做通信协议处理的时候,接收到对端的数据,需要根据固定的结构去做解析。 在某些场景下,需要把字符按一定协议赋值给自己定义的结构体(涉及位域) 我的第一想法是直接强转指针或者按位拷贝,但不能适应所有场景。 可以通过位运算 使用位运算符& 和>> 实现数据的获取.收获到的基础知识点:把一个字符赋值给有位域相关的内存时,可以采用位运算符& 和 >> ,<<实现: &: 提取到一个字节中,对应位置的对应值 >>和<原创 2021-09-28 11:14:05 · 1470 阅读 · 0 评论 -
linux实现守护进程demo
工作中因为业务需要,被要求实现守护进程的功能。对守护进程简单进行理解,从网络获取到一些有用的demo代码,以及自己进行测试,这里做笔记汇总。1:守护进程理解守护进程是一个在后台运行并且不受任何终端控制的进程。个人广义理解:守护进程需要做到,脱离当前启动的终端,重定位输入输出相关信息。代码实现一个守护进程的流程:(最终参考百科) 1:脱离终端:使用创建子进程,终止父进程,僵尸进程的形式实现。 2:在子进程中创建新会话:setsid函数能够使进程完全独立出来,从而脱离fork函数父进程的一些控原创 2021-09-22 18:15:05 · 448 阅读 · 1 评论 -
使用网络调试助手时,踩坑
在使用网络调试助手时,踩坑很多:1: 作为tcp的客户端,或者服务端, 没有注意发送设置以ASCII还是HEX,导致目标环境接收解析数据异常出现段错误。2:作为UDP作为客户端,1:可以作为客户端,接收其他客户端的广播消息.直接设置就可以接收。2:可以作为客户端,给特定的其他远端主机进行消息发送。...原创 2021-09-09 13:14:15 · 6522 阅读 · 5 评论 -
存地址实现组包逻辑的一个测试代码。
汇总:柔性数组配合指针数组的方式,实现组包的逻辑的测试。保存了收到的包,可以扩展结构体,对收到的包做处理。在业务功能代码的实现中,涉及到组包的逻辑: 第一想法想到定义指针数组,用指针数组来实现包的判断以及重组。配合结构体的柔性数组特性,这里尝试了一下实现方案:1:我可以保存每个包的地址,存储包头信息做校验实现。涉及到的知识点:如何存储,目标是存储多个指针,个数是不定的(根据头信息解析) char**a 是二级指针,其实就是指针的指针,初始化的时候注意不能直接用*a去赋值,要正确初始化。原创 2021-08-25 17:05:04 · 140 阅读 · 0 评论 -
字符串转ASSII字符串相互处理
字符串转ASSII字符编解码最近在做tetra网络相关的项目时,涉及到字符串转ASSII的方式进行消息的编码方式,以及对应的解码,就整理一下: 1:其实就是把字符串中每个字符,取高四位,存储对应的十六进制值对应的字符串。 2:反向解析,把ASSII字符串每两个做拼接,转成十进制求出assii对应的字符进行存储。涉及到一个没有关注到的知识点:位运算符:左移(<<)和右移(>>)注意:左移和右移并不会改变指针指向,配合&,|,^可以对数据做一些列操作 >原创 2021-08-10 22:27:05 · 215 阅读 · 0 评论 -
读取配置文件中的数据
我的配置文件中是json格式的数据,直接读取进行打印:#include <stdio.h>#include <stdlib.h>#include <string.h>const static char* json_config_file = "./json_configfile.json";static int read_config_file(char ** outbuff){ FILE* m_File = fopen(json_config_file原创 2021-07-09 15:41:22 · 200 阅读 · 0 评论 -
char**传参,获取函数内申请的字符串,外部释放
在实现业务功能的时候,编写代码的时候遇到一些奇怪的问题,做笔记汇总:1: 用宏的方式实现日志打印,在编译的时候一直有警告,报在宏定义的位置,如下:#define LOG(TAG, format, ...) \ do \ {原创 2021-07-07 15:49:22 · 2148 阅读 · 1 评论 -
#和##的使用以及思考c实现日志打印
c语言日志模块的可实现方案:内容摘自网络,梳理出来。。。1:#和## 属于预处理标记: #后面转换为字符串 ##预处理拼接标记2:VA_ARGS C99中新增的特性,支持宏定义中支持可变参数,接收…传递多个参数。使用在使用了...的宏定义中: #define myprintf(...) fprintf(stderr, __VA_ARGS__)3:如何解析不定参数? ==》应该是__VA_ARGS__ 底层实现,使用va_list4:#VA_ARGS 仅仅展开列表对应的字符串了。5:##原创 2021-06-20 23:49:43 · 173 阅读 · 0 评论 -
Linux 查询 OS、CPU、内存、硬盘信息
Linux 查询 OS、CPU、内存、硬盘信息内容来自某个公众号,感觉有用,就记录了下来。。一.前言当我们接手了一台或者几台服务器的时候,首先我们有必要对服务器的基本配置有所认识,这样才可以对症下药,对以后的软件部署,系统运维会有事半功倍的效果。二.关于服务器基本配置查询服务器的基本配置一般查询操作系统,CPU,内存,硬盘,下面进行逐一讲解。**2.1 操作系统基本配置查询 **查看操作系统版本#cat /etc/redhat-release这个命令主要是查看红帽发行的操作系统的版本号[r原创 2021-06-20 23:38:39 · 220 阅读 · 2 评论 -
c10k百万并发思考
1:使用代码进行测试时,第一个问题: 每个进程可以打开的文件的个数限制:查看相关文件限制:修改配置文件 sudo vi /etc/security/limits.conf,增加如下内容:* soft nofile 100000* hard nofile 100000root soft nofile 100000root hard nofile 100000比如使用xshell重新登陆,用ulimit -a进行查看就会发现已经生效服务器设置更大一点:21000002:第二个问题 :原创 2021-06-20 21:08:57 · 356 阅读 · 0 评论 -
C++11实现生产者消费者
生产者消费者问题源码实现,使用c++11:主要使用c++的锁和条件变量实现/************************************生产者消费者,多线程实现问题有一个存储的队列 生产者生产 消费者取消费1:注意:结构体作为参数,&是引用传递 *是地址传递2:互斥锁的实现和条件变量************************************/#include <thread>#include <mutex>#includ原创 2021-06-20 13:53:24 · 540 阅读 · 0 评论 -
vmware设置窗口自适应大小
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2021-06-20 11:29:38 · 1048 阅读 · 0 评论 -
条件变量函数pthread_cond_timedwait实现业务场景
工作中在进行通信业务开发时,遇到一种超时时间内收到回复做处理的业务场景,使用锁+条件变量实现1:互斥锁和自旋锁接口梳理1:条件变量通常配合互斥锁一起使用:相关定义: pthread_mutex_t g_mutex; pthread_cond_t g_cond;相关初始化: 1:函数初始化/销毁: pthread_mutex_init(&g_mutex, NULL); pthread_con...原创 2021-06-17 14:39:19 · 524 阅读 · 0 评论 -
c语言对字符串进行切割strsep
实现字符串的切割,可以用函数strsep(),这里要注意,strsep()的处理会破坏原数据#include <stdio.h>#include <stdlib.h>#include <string.h>char* udp_msg_data= "1|1|158|{\"InternalFleetNum\":\"12345\",\"PositionDT\":\"2021-05-28T18:52:03\", \\"CoordX\":1178263,\"Coord原创 2021-06-17 14:10:06 · 1205 阅读 · 0 评论 -
linux下获取当前时间相关函数
linux系统下获取当前时间:1:可以获取当前时间的s数结构体: time_t函数 time_t time(time_t * timer)2:可以获取到当前时间的微秒数结构体:struct timevalstruct timeval { time_t tv_sec; // seconds long tv_usec; // microseconds};函数: int gettimeofday(struct timeval *tv, struct time...原创 2021-06-17 11:14:35 · 3856 阅读 · 0 评论