自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 tcp的三次挥手和四次握手

TCP的三次挥手和四次握手TCP之所以要用三次握手,主要为了完成如下几个目标1)防止旧的SYN生效,比如 原来发出的SYN ,由于网络环境比较差,一直没有发送到服务端,客户端又发出了新的SYN, 这时候,如果旧的SYN ACK已经返回,那么,client就要回复一个RST给到服务器端,因为新SYN已经发出了,如果没有 三次握手,那么就可能造成多次连接的存在2)同步双方的序列号四次挥手:四次挥手的过程:首先 主动断开的一方,发送FIN 报文,进入FIN_...

2021-03-11 17:13:29 157

原创 mysql中的事物隔离级别,脏读 不可重复读 幻读

先解释下脏读、不可重复读、幻读脏读:所谓脏读,就是读到了别的事物回滚前的脏数据,比如事物B执行过程中修改了数据X,在未提交前,事物A读取了X,而事物B却回滚了,这样事物A就形成了脏读。不可重复读:事物A首先读取了一条数据,执行逻辑的时候,事物B将这条数据改变了,事物A再次读取的时候,数据不再匹配,这叫做不可重复读幻读:事物A首先根据条件索引得到N条数据,然后事物B改变了这N条数据之外的M条或者增添了M条复合事物A搜索条件的数据,导致事物A再次搜索发现有N+M条数据了,就产生了幻读。不可重

2021-01-03 17:22:13 196

原创 mysql视图

#使用视图的意义#1.简化查询,用户不需要复杂的sql去查询多张复杂的关联表#2. 安全,使用视图的用户只能访问被允许查询的结果,使用视图可以限制用户访问一些敏感信息drop table if exists users;create table `users`( `u_id` int(4) not NULL auto_increment, `username` varchar(20) DEFAULT NULL, `age` int(4) default NULL, `countr

2020-10-05 18:48:40 173

原创 联表查询

drop table if exists t1;CREATE table t1(id int not null,name VARCHAR(20));insert into t1 values (1,'t1a');insert into t1 VALUES (2,'t1b');insert into t1 VALUES (3,'t1c');insert into t1 VALUES (4,'t1d');insert into t1 VALUES (5,'t1f');drop tabl

2020-10-05 17:22:39 99

原创 sql子查询

CREATE table if not EXISTS customers( `cust_id` int(200), `cust_name` char(20), `cust_address` char(20), `cust_city` char(20), `cust_state` char(20), `cust_zip` int, `cust_country` char(20), `cust_contact` c

2020-10-05 16:13:28 94

原创 cpp的类型转换

cpp在类型转换之前利用编译器做检查是一个好的习惯,鉴于dynamic_cast的效率问题,建议使用static_cast做转换,向上转换一般是安全的(向上转换指的是子类转换为父类)有两个转换函数template<typename To,typename From>inline To implicit_cast(From const &f){ return f;}template<typename To,typename From>inl..

2020-07-26 11:05:15 285

原创 sockaddr和sockaddr_in的区别

sockaddr的定义如下struct sockaddr{sa_family_t sin_family; //地址族char sa_data[14]; //14字节,包含套接字中目标地址和端口信息}sockaddr_instruct sockaddr_in{sa_family_t sin_family; //地址族uint16_t sin_port; //16位 TCP/UDP 端口号struct in_addr sin_addr; //32位I

2020-07-25 17:51:56 102

原创 std::vector 的reserve和resize

reserve 和capacity 是对应的resize 和size是对应的capatity表示容器有多少可以用,但不代表可用size表示可用的内存,用之前要resize

2020-07-24 16:58:09 180

原创 windows导出lib文件符号表的方法

windows可以使用dumpbin命令导出符号表

2020-07-23 20:23:23 1501

原创 阻塞非非阻塞socket以及同步与异步的关系

阻塞与非阻塞是针对调用方而言的,例如调用send函数,如果在缓冲区没有空间提供给数据拷贝,那么如果是阻塞的socket,该线程会一直在send处等待,如果是非阻塞的socket,函数是立即返回。同步异步是指数据的发送方式,同步就是数据发送出去并等待数据发送的结果,异步就是数据发送以后立即返回,通过消息机制通知发送的结果,一般来说,只有调用了 aio_write和aio_read或Windows下的IOCP才认识是异步IO...

2020-07-12 16:32:33 131

原创 FD_CLOEXEC

为什么socket要设置 FD_CLOEXEC ,原因就是主线程在fork子线程的时候,会把文件描述符也拷贝一份,当子线程在执行exec的时候,执行新的程序,而文件描述符并没有被关闭,由于在内核里面保存有文件描述符数量的引用计数,那么,如果不在exec被调用之前关闭文件描述符,那个该文件描述符就会出现没有被关闭的情况。...

2020-07-12 15:22:41 461

原创 为什么要忽略SIGPIPE信号

在socket编程中,要忽略SIGPIPE信号,这是因为,如果socket的对方已经关闭连接而我方依然在写入的情况下,会导致进程退出,因此要忽略该信号

2020-07-12 11:48:50 468

原创 mutable的用法

理论上在const修饰的函数里面( func() const ) func()函数内部是没有办法修改成员变量的值的,但是,如果成员变量是mutable修饰的话,就可以修改这个变量了

2020-06-14 16:32:32 278

原创 string 和hex相互转化

string与hex的相互转换string 转 hex调用 std::stoi函数(c++11)std::string str = "abcd123";unsigned char hex = std::stoi(str,0,16);hex 转 stringstd::string HexArrayToString(const unsigned char* data,int len){ const std::string hexme = "0123456789ABCDEF";

2020-05-27 15:55:56 10813

原创 返回值类型后置

返回值类型后置,cpp提供的用于推导返回值类型的方法。举例来说:template<class X,class Y>? mutil(X x,Y y){return x*y;}这时候,就没法推导返回值的类型当然可以使用template<class T,class U> decltype(*(T* )(0)*)**(U*)(0)) mul(T x,U y)...

2020-04-15 20:35:05 249

原创 断言和异常的区别

异常被捕获后可以不做处理,程序从捕获位置继续执行,断言是无法忽略的,程序在断言失败处立即终止。断言通常用于调试版本,用来发现程序中的错误,虽然异常也能起到这样的作用,但是不应该用异常代替断言。1)如果发生了逻辑错误,必须修改程序,而不可能在程序中进行处理和恢复,随意不需要向外传送,没有必要使用异常。2)使用断言的开销比异常小得多,而且断言可以从发布版完全去除。异常用于处理争取程序中的运行期问...

2020-04-11 16:04:57 747

原创 string的内存优化技术

c++的string类有两种内存优化技术,分别为SSO(Small String Optimization)即,由于申请堆内存的开销比较大,因此,短的字符串会被申请在栈上另一种优化技术是COW,也就是写时复制,写时复制在linux系统上应用很广泛,写时复制意思是如果字符串没有写操作,那就执行浅拷贝,如果有写操作,再执行深拷贝。这样可以避免不必要的拷贝开销。...

2020-04-05 14:58:16 2091

原创 学习计划

学习过程中,要逐步形成自身的核心能力,就是以数据存储和分布式以及服务器为核心的能力。这就要求自身要对redis以及mysql数据库非常的熟悉。而且深入理解其中的源码和使用方法。...

2020-03-26 17:25:05 125

原创 一种安全的从文件中读取一段数据的方法

一种安全的从文件中读取一段数据的方法void ReadLen(int fd,int Len.char* buf){ssize_t ret;while(len!=0&&(ret = read(fd,buf,len))!=0){if(errno == EINTR)continue;perror(“read”);break;}len -= ret;buf += r...

2020-03-21 11:30:26 165

原创 fflush与fsync的区别

fflush用于把C标准缓冲的数据写到内核缓冲,而fsync及其其他类似的函数用于将数据从内核缓冲写进磁盘。

2020-03-20 20:18:08 214

原创 学习计划

在未来的一年或数年里,需要逐步学习和掌握如下几个方面的知识,包括服务器编程,关系型数据库,非关系型数据库,进一步提升自己算法能力,也需要在rpc,mq等方面有所涉猎,应该掌握三种语言,包括c++,java以及shell。每天坚持学习,严格按照计划取得进步。...

2020-03-10 17:23:44 61

原创 linux查看文件几个方式以及优缺点

linux 查看文件有几个方法注:新建文件可以使用 touch查看文件类型可以使用 file查看文件cat 命令 :cat命令会显示所有的文档内容除此之外,加上一些参数定制服务,例如,cat -n file 可以显示行号cat -b file 会只显示有文本的行号 more命令: more命令可以显示部分,一般是一页,而 cat 命令会显示 全部内容,内容较多的...

2020-03-10 17:17:20 296

原创 算法二:求解无重复字符的最长子串

该代码实现的思路来自leetcodeint lengthOfLongestSubstring(string s) { if(s.empty()) { return 0; } size_t size = s.size(); int i = 0,j = 0; int len = 0; ...

2020-02-27 19:29:26 99

原创 算法一:输入一个数组和一个target,求解两数之和等于target的数组下标

该题最简单的做法是暴力穷举法,但是穷举法的算法复杂度是o(n^2),所以可以采用如下方法,利用哈希表的特性,使算法复杂度降到o(n)class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,...

2020-02-27 18:04:18 1023

原创 linux创建进程创建的3个描述符

linux在新建一个进程的时候,会创建3个描述符,0 1 2,分别是标准输入,标准输出,以及标准错误三个描述符。

2020-02-25 17:24:15 190

原创 linux系统调用

linux系统调用是通过软中断实现的,举例,如果用户空间程序想要调用内核中的open函数,那么用户空间会想eax写入一个5(代表open)。然后触发一次软中断。...

2020-02-25 16:33:45 73

原创 linux使用backtrace打印堆栈信息并调试

https://blog.csdn.net/gongmin856/article/details/79192259

2020-02-25 14:49:56 681

原创 多进程服务端

多进程的服务端,在主进程里面调用accept操作,由于fork创建的子进程与主进程拥有相同的内存空间,也就是服务端和客户端的套接字描述符在子进程的内存空间里面存在相同的一份拷贝,因此,子进程的处理函数首先就要关闭服务端的套接字描述符,避免多个描述符指向同一个套接字,然后再做相关的操作,代码如下所示:include<stdio.h>#include<stdlib.h>#...

2020-02-24 15:16:17 147

原创 僵尸进程的定义以及回收

僵尸进程的定义:当子进程调用exit或main函数有return语句返回的时候,子进程会把返回值发送给操作系统,操作系统不会回收该子进程知道该子进程的父进程获取该子进程的返回值,这种状态就是僵尸进程。结合unix的信号机制,以及signal函数,可以使用下面的代码实现僵尸进程的回收:#include <stdio.h>#include <stdlib.h>#incl...

2020-02-24 13:58:29 818

原创 signal和sigaction的区别

signal函数是为了兼容旧的,sigaction函数比signal函数更稳定,原因是在不同的unix系统里面signal函数会有不同,但sigaction函数完全相同。

2020-02-24 11:06:11 830

原创 linux fork函数的使用

linux的fork函数用于创建一个新的子进程例如pid = fork();如果pid等于0,说明此时运行子进程如果pid不等于0,说明运行的是父进程

2020-02-24 09:34:58 112

原创 nagle算法的作用

在TCP连接中,会默认开启nagle算法。nagle算法的作用,举例来说,如果tcp发送一个小段数据,比如数据的大小为 1,2,3,2,1 五个数据段,如果禁用nagle算法,就会出现一个问题,这5个小的数据段会被发送5次,而如果使用nagle算法,那么小的数据段会被重新组合,后面的数据段会被组合成一个大的数据段发送,但这也同时影响了发送速度。禁用Nagle算法代码:int opt_val ...

2020-02-23 19:13:02 686

原创 TCP 禁止进入Time_wait状态设置

TCP在断开连接的时候,主动发起断开连接操作的一方,比如server调用close断开连接的时候,会发送FIN包,server因此会进入time_wait状态,进入time_wait状态后,如果程序重启,就会出现bind error的错误,因此为了防止这个错误,可以设置在time_wait状态下端口号重新分配给新的套接字,设置SO_REUSEADDR这个参数打开就可以实现这个功能。具体的代码如下...

2020-02-23 18:24:24 248

原创 TCP如何优雅的断开连接

在某些应用场景中,TCP需要优雅的断开连接,比如某一个场景,A和B之间建立了一条链路,那A想要向B发送数据包后断开连接,然后B收到数据包后要做数据回复,那么在调用close断开连接的时候,显然B发送的数据A没有办法收到,这个时候可以调用shutdown函数,该函数可以采用逐个关闭流的方式优雅的断开连接,比如A发送完数据以后,可以直接调用shutdown关闭写流,而B在收到数据后,发送的数据依然可以...

2020-02-23 17:22:13 804

原创 网络地址分类与主机地址边界

可以通过网络字节的范围来判断地址是A类,B类,还是C类地址,A类地址的首字节范围为:0-127.B类地址的首字节范围为128-191,C类地址的首字节范围为192-223。...

2020-02-22 17:45:40 451

原创 端口号的作用

端口号就是在同一操作系统内为区分不同套接字而设置的,因为无法将1个端口号分配给不同套接字。

2020-02-22 17:28:09 366

原创 tcp知识点一,缓冲区满

在TCP传输过程中,如果read函数的读取速度比接收数据的速度慢,则缓冲区可能被填满,此时套接字无法再接收数据,但即使这样也不会发生数据丢失,因为传输端套接字将停止传输。也就是说,面向连接的套接字会根据接收端的状态传输数据,如果传输出错还是提供重传服务,因此面向连接的套接字除特殊情况不会发生数据丢失。...

2020-02-22 16:53:57 2478 1

原创 工作中应该学习什么

转眼间已经工作了很久时间了,想想这段时间的工作,实际上在技术上没有很大的进步,也就是没有和别人拉开本质的差距,这是我现在面临的最大的问题。在学习的方向上面,也颇犹豫不定,到底应该重点学习哪些东西,过去的一段时间,我一直投入相当的精力在数据库的学习上面,目前应该说学得差不太多了,未来,为了进一步的学习技术知识,无论是从提升工资的角度,还是从提升自身价值的角度,都应该学会思考接下来的学习方向,学习的目...

2020-02-20 16:46:40 496 1

原创 容器的commit-or-rollback

对于以节点为构造基础的容器(node-based)例如list,set,mutilset,map和multimap以及无序容器。如果节点构造失败,容器将保持不变,这其中,如果插入多个元素除了list是事务安全的,其他并不安全对于以array构造基础的容器如array、vector和deque,安插元素如果失败,不可能做到完全回滚。提供一种外覆器的实现,实现容器的 “commit-or-roll...

2020-01-19 17:30:10 304

原创 remove删除容器元素时需要注意的事项

remove在删除内存中某元素的时候,该元素对应的内存不会被删除,该内存会被该元素后面的数据填充,也就是说如果要删除该内存,需要和erase配合使用,距离:#include#include#include #include using namespace std;int main(){list coll;for(int i = 0;i<=6;i++){coll.pu...

2020-01-19 11:13:12 294

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除