- 博客(91)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SCTP协议详解与实例
1.SCTP是什么?只要是接触过编程的人,当你问他传输层都有哪些协议?我想几乎很多人会说TCP,IP协议而很少有人知道SCTP(流控制传输协议)这个和上述俩个协议具有相同地位的协议。 SCTP提供的服务与TCP,UDP类似,或者甚至可以理解为其是TCP与UDP协议各自优点的组合后的产物。2.SCTP的特点(1)SCTP连接的建立SCTP协议建立连接可调用int sctp_connectx(int
2016-03-31 18:24:13
28165
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 muduo网络库脉络分析(2)
因为此篇博文是上篇博文的延续,所以读者在阅读此时最好能先去看一下muduo网络库脉络分析(1)Channel类其实在上篇博文讲完Acceptor类之后,我因该按照流程顺序接着讲TcpConnection类的,但是因为TcpConnection中包含一个很重要的类Channel类,之前讲时也都有设计Channel类,但是我只是笼统的描述那是对事件的一个抽象,所以这里将Channel类,既可以帮助大家理
2016-03-21 17:44:35
1652
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 muduo网络库脉络分析(1)
去年看muduo网络库时没有总结博文,导致前段时间用muduo时发现好多东西都模模糊糊,于是就花时间又一次翻阅了muduo源码,并用此篇博文记录下其网络库整体脉络,以便是后来者入手起来更方便,同时也可用作自己以后复习的资料1.如何入手muduo库其实在这之前也没有尝试去分析一个网络库的总脉络,更没有去尝试把它以博文的形式总结下来。那么我们该如何尝试去分析这样一个网络库的整体脉络呢?其实我有想过将mu
2016-03-21 13:54:42
2614
6
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 解密:protobuf协议序列化后的变体
1.protobuf是干什么的protobuf为google公司出品,其全称为Protocol Buffers。关于其是什么网上一搜一大堆,但是初学者往往还是看的晕头转向。其实简单的概括protobuf的功能无非就是对结构化数据串行化。举个简单的小例子struct Person{ int number; //编号 char name[100];
2016-03-18 20:15:10
8019
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 栈溢出攻击的一次简单尝试
1.栈溢出的一个简单实例下面程序可能是那些接触C不久之后,可能会犯的一个数组越界导致缓冲区溢出的一个小例子#include <stdio.h>#include <unistd.h>#include <stdlib.h>void func(void){ int a = 23456; int b[2]; printf("b[2] = %d\n",b[2]); }in
2016-03-10 00:38:37
3912
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 利用ucontext.h中接口实现用户级别线程库
想必大家在初次接触多线程或多进程时一定会感觉这是多么的神奇!一个程序居然可以“同时”执行好多工作,此时你一定有一探其究竟的想法吧?可是无奈,这些都是内核中十分复杂的代码。对于初入计算机大门的我们,去看那些东西,的确有些困难。但是不用灰心,本篇博文我将为大家介绍一个由我自己实现的简单线程,代码也就100多行,程序还很简陋,但是我感觉这有助于我们对进程或线程的理解1.设计思路要实现线程,那么就先得有个简
2016-01-07 17:54:02
4448
7
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 自动注册工厂消灭switch-case
之前在代码重构书中有了解过java中的反射机制可以消除switch-case,详情可以参考这篇博客http://blog.csdn.net/wwh578867817/article/details/49309789。那么我们的C++有没有类似干掉switch-case的方法?1原始的工厂是如何创建派生类对象的假如我们有个基类为Father,它有好多继承类分别为Son1,Son2,… 那么我们原始工
2016-01-04 23:56:40
2296
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一个高效的异步日志
假如让你自己去写一个日志程序,我想最原始且简单的想法因该是,首先将要写入日志文件的内容转化为字符串,然后调用write系统调用将其写入文件。这种实现方法的确就是我们程序最原始的日志方法。这种做法无疑是十分低效的,那么如何让我们的日志能够高效起来呢?本篇博文就是要给大家分享一种高效的日志–异步日志1.异步日志要实现什么?前言中我有告诉打下那种最原始且简单的日志方法很低效,那么它低效在什么地方了呢?
2015-12-27 19:42:12
9288
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 fastcgi协议分析与实例
1.序言最近在用c++实现一个简易web服务器。在实现之前大体理了一下一个web服务器主要咋样实现。当时单纯的认为只需要将浏览器发来的http请求解析,找到对应的文件,然后给浏览器一个响应,把其要获取的文件发给它就完事。可是写了没几天就遇到了瓶颈。因为我们的浏览器并不能解析动态的php文件,那么如果获取的http请求的请求文件为.php文件我们该杂么办呢?2.将.php转换为.html的php-fp
2015-12-19 00:50:01
10396
7
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 浅析linux服务端socket编程
记得大一第一次接触linux服务端编程时,当时看的1.Socket接口socket接口用来创建一个套接字描述符,函数定义如下int socket(int domain,int type,int protocol);//成功返回文件描述符,失败返回-1参数介绍: .domain指定使用哪个底层协议,PF_INET(ipv4) PF_INET6(ipv6) .type指定协议的服务
2015-12-01 00:46:46
1938
4
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 muduo网络库中buffer的设计
1.为什么非阻塞网络编程中应用层buffer是必须的非阻塞I/O(在这里可以理解为非阻塞I/O加T/O复用)的核心思想就是避免将当前线程阻塞在I/O系统调用上,这样可以使我们的I/O线程只阻塞在I/O复用函数上(epoll_wait或poll,select)使其能够服务更多的连接socket那么如何才能做到这一点呢?这里我们就需要实现应用层的输入输出buffer(1)什么情况下用到output b
2015-11-03 16:41:45
3789
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 linux下aio异步读写详解与实例
1.为什么会有异步I/Oaio异步读写是在linux内核2.6之后才正式纳入其标准。之所以会增加此模块,是因为众所周知我们计算机CPU的执行速度远大于I/O读写的执行速度,如果我们用传统的阻塞式或非阻塞式来操作I/O的话,那么我们在同一个程序中(不用多线程或多进程)就不能同时操作俩个以上的文件I/O,每次只能对一个文件进行I/O操作,很明显这样效率很低下(因为CPU速度远大于I/O操作的速度,所以当
2015-09-27 10:43:56
17119
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 EPOLL在ET模式下会被触发多次么?
前几天和同学一起讨论EPOLLONESHOT的作用,它的功能是这样的:对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的包括可读,可写,错误中的一个,且只触发一次刚一看感觉EPOLLONESHOT咋么就是ET模式相对于LT模式的区别,反复理解之后发现原来ET和ONESHOT的区别是ET只是可读可写或错误类的某一种事件类型只能被触发一次,而不同种类的事件类型却可以触发不止
2015-09-22 12:27:43
3343
7
原创 细说redis持久化流程
文章目录一. 概述redis持久化的俩种模式二. rdb持久化模式1.rdb持久化核心思路2.rdb持久化难点3.rdb持久化后rdb文件的格式4.rdb持久化触发条件5.rdb持久化数据安全性6.rdb持久化核心源码(bgsave为例)三. aof持久化模式1.aof持久化核心思路2.aof持久化难点3.aof持久化文件格式4.aof持久化触发条件5.aof持久化对redis性能影响6.aof文...
2019-05-17 10:32:32
1300
原创 探索redis数据过期策略
为什么要处理数据过期1.过期设置为程序逻辑的一部分,所以为了保证逻辑正确(不读取到过期数据),不得不对缓存做数据过期处理2.过期数据,对业务来说已是无用数据,但是却仍然占有服务资源(主要是内存和磁盘),故处理过期数据,将其删除可以使服务资源得到释放处理过期数据的常用策略策略说明优点缺点定时删除根据键的过期时间设置定时器,触发超时及删除对应键删除及时,内存友好在...
2019-03-19 16:35:46
2126
原创 记MySQL的一次启动异常
1.背景测试环境一直运行良好的MySQL突然莫名挂掉,登上机器重新启动,居然没启动起来2.寻找原因尝试一: 查找问题最简单的方法当然是先看日志报错:如图1所示MySQL启动异常系命中了红框内的断言错误所致,根据那行代码大概猜测可能是buf的长度不够导致的异常。这时候接着往下看,发现MySql提示要保证系统内存满足如下大小:key_buffer_size + (read_buffer_s...
2019-02-22 11:25:56
414
原创 MySQL数据复制原理及实践
##1.数据复制概述####1.1数据复制定义数据复制使一个服务上的数据与另一个服务上数据保持同步####1.2复制用途数据分布负载均衡备份高可用和故障切换MySQL升级测试##2.数据复制工作原理####2.1复制工作流程介绍(以主从架构为例)MySQL复制原理比较简单,其核心工作示意图如下:主库把更新操作记录在二进制日志文件中备库上的I/O线程收到主库的更新事...
2018-11-07 17:35:27
364
原创 linux内核源码do_fork分析
我们都知道进程是linux内核中最为重要的一个抽象概念,那么我们平时在fork一个进程时,该进程究竟是咋么产生的呢? 本篇博文会浅谈一下在进程创建过程中扮演着重要角色的do_fork函数1.内核如何来抽象一个进程内核通过一个叫做task_struct的结构体来抽象一个进程该结构体的定义(以内核2.6为例)在include/linux.sched.h中截取部分task_struct如下task_st
2016-10-20 13:33:42
2820
原创 MySQL数据库对象管理
本篇博文会简单的介绍MySQL数据库对象的管理,其中会着重介绍其权限管理与字符集一.权限管理1.添加或修改密码对于MySQL我们可以通过mysqladmin来添加或修改密码 修改root用户密码为123456mysqladmin -uroot -p password '123456'2.创建一个新用户我们平时都直接用root用户来登陆MySQL这是很不安全的,此时添加新用户就显的很重要了 添加新
2016-06-17 23:30:35
2749
1
原创 PHP-表单
1.PHP表单处理 PHP的超全局变量GET和_GET和_POST用于收集表单数据一个简单的HTML表单如下<html><head> <meta charset="utf-8"></head><body><form action="welcome.php" method="post"> Name:<input type="text" name="name"><br>
2016-06-07 16:18:57
974
原创 PHP-超全局变量
PHP中许多预定义的变量都是“超全局的”,这意味着他们在一个脚本的全部作用域中都可用。在函数或方法中无需执行global $variable;也可以访问他们这些超全局变量为: .GLOBALS ._SERVER ._REQUEST ._POST ._GET ._FILES ._ENV ._COOKIE ._SESSION1.$GLOBALS-引用
2016-06-06 19:13:57
1117
原创 jQuery-AJAX
1.AJAX简介(1)什么是AJAX AJAX = 异步 javascript 和XML(Asynchronous JavaScript and XML) 简单的说在不重载整个网页的情况下,AJAX通过后台加载数据,并在网页上进行显示 即其可实现对网页进行部分加载与显示(2)jQuery与AJAX .我们可以通过jQuery的AJAX方法,使用HTTP GET和HTTP Pos
2016-06-05 20:24:31
763
原创 jQuery-HTML
jQuery-获得内容和属性(1)jQuery中非常重要的部分,就是操作DOM的能力 jQuery提供了一系列与DOM相关的方法,这使访问和操作元素和属性变得很容易 DOM = Document Object Model(文档对象模型) DOM定义访问HTML和XML文档的标准(2)获得内容-text()、html()以及val() 三个简单实用的用于DOM操作的jQuery方法
2016-06-05 15:39:16
896
原创 jQuery效果
1.jQuery效果-隐藏和显示我们可以通过jQuery的hide()和show()方法来隐藏和显示HTML元素 语法如下 $(selector).hide(speed,callback); \$(selector).show(speed,callback);其中speed参数为可选参数,用其来确定隐藏/显示的速度,可以取以下值’slow’,’fast’,或毫秒 callback也为
2016-06-05 02:07:50
632
原创 DOM文档对象模型
1.DOM简介 (1)当网页在加载时,浏览器会创建页面的文档对象模型(Document Object Model) HTML DOM 模型被构造为对象树一个简单的DOM树如下图 JS通过可编程对象模型获得的能力 .JS能够改变页面中HTML的所有元素 .JS能够改变页面中的所有HTML属性 .JS能够改变页面中所有的CSS样式 .JS能够对页面中所有事件作出反应
2016-06-04 12:02:21
685
原创 JavaScript基础学习
1.JS简介(1)JS的基本输出语句实例如下<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <script> document.write("<p>this is javascript</p>");
2016-06-03 18:06:50
634
原创 CSS样式学习笔记
1.CSS背景颜色我们可以使用background-color属性为元素设置背景色 这条规则把元素背景色设为灰色 p {background-color: gray;}如果我们希望背景色从元素中的文本向外少有延生,只需要增加一些内边距 p {background-color: gray; padding: 40px;}具体实例如下<!DOCTYPE html><html lang="
2016-06-03 14:26:04
756
原创 CSS基础学习笔记
初学CSS所以就以博客的形式记录下来,权当是个记事本了。1.CSS语法CSS规则由俩个主要部分构成:选择器,以及一条或多条声明 selector {declaration1;declaration2;… declarationN}其中选择器通常是你需要改变的HTML元素,例如”p”或”h1”这些 每条声明由一个属性和一个值组成 其中属性(property)是希望您设置的样式属性。每个属性都
2016-06-02 14:19:41
651
原创 Shell学习-入门(一)
本篇博文主要向读者介绍shell的环境以及熟悉shell的基本特性 本篇博文中所涉及的所有实例都是在ubuntu15.04版本下演示的1.shell简介 shell脚本通常是以 #! /bin/bash 为起始的文本文件,有俩中运行脚本的方式,一种是以bash解释器运行bash script.sh如果学过python的话,你会感觉和我们用python解释器运行python是很类似的 我们
2016-05-30 01:56:09
646
原创 Redis中基本数据类型的操作
redis是目前比较主流的nosql数据库了,实际应用也变的越来越流行,所以感觉还是很值得一学的,新手初入此们(哈哈) redis的下载戳这里http://download.redis.io/releases/redis-2.8.12.tar.gzRedis中的数据结构使用1.字符串string的使用字符串的操作命令表 命令 行为 GET 获取存储在给定键中的值 SET 设置
2016-05-25 01:30:45
830
原创 将普通图片转化为字符画(Python)
1.设计思路如何把以.png的图片以不同字符把它形象的画出来呢? 我们知道其实一张图片是由很多不同像素点所组成的,每种像素点可以表示一种颜色。那么如果我们用不同的字符来代替各种像素点,是不是就可以将图片转化为字符画了?没错就是要用这个原理2.需做的准备为了实现我们本片博文所述的功能,不许得有一个叫做Pillow(PIL)的图像处理库 该库的安装方式如下pip install pillow我们今天
2016-05-20 22:09:49
10411
4
原创 Python解析模块argparse
初学python,今天在偶然间了解到python中有个解析模块argparse,其实此解析模块和linuxC下的getopt()的功能大同小异,写此篇博文的目的只是为了做个笔记~熟悉linux系统命令的人都知道,每个命令后面都可以跟许多参数来实现不同的功能,拿最简单的ls来举例吧 当我们输入ls是终端就会展示出当前目录下的所有文件名 当我们输入ls filename,此时ls后面加了对应的
2016-05-20 00:22:28
1053
原创 深夜杂记
不知不觉撸码到现在,突然间感觉已经马上就大四了,大学生活还没来得及感受,似乎就要过完了。估计工作之后很少会有为了兴趣而撸码到现在吧?所以得抓紧时间赶紧多学些自己真正感兴趣的东西才好哇!
2016-05-17 03:44:59
784
1
原创 Linux下源码分析利器Ctags
最近有看一些代码量比较大的开源代码,在阅读的过程中感觉读大型的源码真的好难。我们先不说其逻辑方面的难度,而是你在读的过程中所遇到的大量的宏定义,类型定义,函数定义以及一些枚举变量等把我们搞的是晕头转向,因为我们得到其他文件里找到他们的原始定义,这真是最令人头疼的地方。此时你是否会想要是有一个程序能自动帮我们找到上述东西的原始定义那该多好。其实linux下就有这个工具ctags1.Ctags的安装方法
2016-05-03 23:16:48
4031
原创 高性能的MySQL索引
索引是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量很大时,索引对性能的影响就越大。虽然索引对数据库性能而言如此重要,但好多使用其的人却常常忽视它。本片博文就是为大家介绍一些MySQL索引相关的知识1.认识索引 要理解MySQL中的索引是如何工作的,最简单的方法就是看一下我们书里的目录(索引)部分,我们根据目录来找到其某个内容在哪个章节,锁定某个章之后,
2016-04-09 22:05:32
813
原创 MySQL基本概述
MySQL是非常灵活的一款数据库,虽然它不是绝对完美,但它的灵活足够适应很多高要求的环境。为了发挥MySQL的性能并很好的使用它,我们就得先了解其设计。MySQL的灵活主要体现在我们可以通过不同的配置使他在不同的硬件上都能运行的很好。但是MySQL最重要,与种不同的特性是它的存储引擎架构,这种架构将查询处理及其他系统任务和数据的存储/提取相分离。1.MySQL的逻辑架构 如上图,我们可以简单的将其
2016-04-09 16:36:12
11837
原创 走进nginx事件驱动模型
最近在看阿里陶辉前辈写的”深入理解nginx”中的nginx的事件模块。之所以想看这块内容,是因为nginx可以处理庞大的并发连接,想看看支持其背后的事件驱动是如何构建的这篇博文我也不想贴代码什么的整一堆东西来讲述nginx事件驱动,一来我未必理解的那么透彻,而来这样反而更不易阅读者快速的掌握知识,所以我会简单的将几个我认为可能会对我之后的服务器程序开发中有所帮助的几个知识点简单论述nginx的ep
2016-01-13 11:58:52
5260
1
原创 C++11简化线程池的实现
我想用C语言写过线程池的朋友因该都知道用C语言写一个线程池有多么的麻烦,代码差不多300行左右,而且不易阅读。记得大二寒假第一次写线程池用的就是C语言,当时先参考了别人用C写的代码,说实话看起来真困难,因为C写出来的结构好乱,代码又多。我最近在实现一个自己的简单C++网络库(欢迎指点https://github.com/Miaoshuai/netlib),需要一个线程池,本来可以直接用之前拿C写的那
2015-12-27 16:50:46
7062
4
原创 当线程函数为C++类成员函数时
很多时候我们在C++多线程开发时,都会或多或少遇到线程函数为C++类中的某个成员函数,此时可能会发生什么呢?你有可能会杂么做呢? 接下来我就为大家总结一下我在这方面走过的一个历程1.问题一记得我在之前在写一个udp传输文件的程序时,我就第一次遇到了线程函数为C++类的成员函数,当时遇到的问题,大概意思如下:#include<iostream>#include <thread>#include
2015-12-26 20:03:10
18498
6
原创 左值与右值
为了支持移动操作,新标准引入了一种新的引用类型–右值引用。所谓右值引用就是必须绑定到右值的引用。我们可以通过&&来获得幼稚引用1.左值和右值的定义左值和右值都是表达式的属性。一般而言,左值表达式表示的是一个对象的身份,而右值表达式表示的是一个对象的值 例如int i=3;在这里i就是一个左值,它代表了自己是个int型变量(一种身份),而3则仅仅是一个值,所以其为右值。一般来说,右值为一个临时的值,
2015-12-25 15:47:23
916
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人