- 博客(73)
- 问答 (1)
- 收藏
- 关注
转载 HTTP协议与HTML表单(再谈GET与POST的区别)
HTTP的GET/POST方式有何区别?这是一个老生常谈的问题,但老生常谈的问题往往有一些让人误解的结论。本文将带您浅尝HTTP协议,在了解HTTP协议的同时将会展示许多被人们忽视的内容。在掌握了HTTP协议的过程中我们将自然而然地了解到GET与POST的本质区别。HTTP请求从使用者的角度看,一个HTTP请求起始于用户端浏览器上输入的一个URL地址;网页中的一个超链接;提...
2019-09-27 19:04:54
422
转载 wireshark如何抓取本机包
在进行通信开发的过程中,我们往往会把本机既作为客户端又作为服务器端来调试代码,使得本机自己和自己通信。但是wireshark此时是无法抓取到数据包的,需要通过简单的设置才可以。 具体方法如下:方法一: 1.以管理员身份运行cmd 2.route add 本机ip mask 255.255.255.255 网关ip 如:...
2019-09-06 16:39:26
2500
原创 h264切割出nalu的两种方式
目录前言:一、Annex B格式二、AVCC格式三、总结前言: 目前h264中nalu的组织格式主要有两种:Annex B格式和AVCC格式。下面介绍一下这两种格式,并结合开源流媒体服务srs的代码来分析这两种格式。一、Annex B格式 Annex B格式是用开始码来分割前后的nalu,即在每个nalu前面加上2个或者3个0x0...
2019-09-05 12:10:19
2495
原创 srs源码解析2【http-flv播放】
目录前言:一、SRS中的http处理套路二、http-flv播放详情三、总结前言:http-flv和hls都是基于http协议的。在SRS中,http的处理借鉴了golang的http处理架构,但是也有一些冗余的信息。本节,主要解析http-flv播放并触发回源的流程,以及与flv协议相关的内容。一、SRS中的http处理套路1、ISrsHttpServeMux...
2019-08-27 17:12:56
4040
1
转载 滚动日志
logrotate机制和原理2015-07-23日志实在是太有用了,它记录了程序运行时各种信息。通过日志可以分析用户行为,记录运行轨迹,查找程序问题。可惜磁盘的空间是有限的,就像飞机里的黑匣子,记录的信息再重要也只能记录最后一段时间发生的事。为了节省空间和整理方便,日志文件经常需要按时间或大小等维度分成多份,删除时间久远的日志文件。这就是通常说的日志滚动(log rotation)。最...
2019-08-27 15:48:15
3033
原创 srs源码解析3【rtmp播放】
目录前言:一、主要流程二、详细介绍三、总结前言:目前直播领域业界流行的协议主要有三个:rtmp、http-flv、hls。其中,http-flv、hls是终端播放(称为下行)经常使用的协议,rtmp通常作为推流协议(称为上行)使用。srs主要有两种模式:回源模式 和 推流模式,笔者由于项目中主要涉及到的是回源模式,所以本文重点分析一下srs中从收到rtmp播放请求到被动去使...
2019-07-29 10:43:23
1116
原创 srs源码分析1【配置文件解析】
一、整体了解解析代码前,先从源码注释中大概了解srs配置信息的组成结构:/*** the config directive.* the config file is a group of directives,* all directive has name, args and child-directives.* for example, the following config...
2019-07-24 16:28:28
1949
转载 Linux下动态共享库 连接和加载路径
链接路径连接时找不到某一个函数,出现“ xxxxx undefined”,应该就是连接时找不到相应的动态库,连接时动态库的路径如下:1> 默认路径是:/lib, /usr/lib/, /usr/local/lib2> -L: 指定连接时动态库的路径3> LD_LIBRARY_PATH: 指定连接路径运行路径运行应用程序时出现...
2019-03-07 19:37:17
834
转载 man的使用总结
Linux man命令的使用方法Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。Linux的man手册共有以下几个章节:代號代表內容1使用者在shell中可以操作的指令或可执行档2系統核心可呼叫的函数与工具等3一些常用的函数(function)与函数库(li
2017-05-15 17:25:43
336
转载 #define中#和##的作用
#define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ) { puts(d(f(a,b))); puts(s(f(a,b))); } 输出结果: f(a,b) ab分析: ##把两个符号连起来 #a指把a当成符号,就是把#后面的
2017-02-24 15:27:14
13891
原创 linux平台下的写文件刷新
[toc] c语言libc库自带的fflush和linux的sync、fsync、fdatasync,字面上都是刷新缓冲区数据到磁盘(当然,fflush还可以刷新缓冲区数据到标准输入、输出以及错误输出)。下面就分析一下上面提到的四个函数的区别。一、c语言fflush和linux的sync、fsync、fdatasync的区别1.接口基本不同fflush是libc库中提供的函数,平台无关,
2017-02-23 16:27:04
5801
2
转载 linux 同步IO: sync、fsync与fdatasync
传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bac
2017-01-09 15:05:15
446
转载 coredump相关
一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函
2016-12-30 10:19:00
1241
转载 linux开发调试工具
一编译阶段nm获取二进制文件里面包含的符号strings获取二进制文件里面的字符串常量strip去除二进制文件里面包含的符号readelf显示目标文件详细信息objdump尽可能反汇编出源代码addr2line根据地址查找代码行二运行阶段ldd显示程序需要使用的动态库和实际使用的动态库ldd binlsstrace跟踪当前系统调用ltrace跟踪当前库函数time查看程序执行时
2016-12-30 10:12:19
413
原创 diy数据库(十二)--diydb基于一致性hash的集群演示
一、前言 前面分析了那么多代码和原理,显得太过枯燥。那么,本章就来结合我在客户端基于一致性hash实现的数据库集群来一并演示一下diydb的实际运行情况。二、演示 1、启动数据库服务器diydb 从服务器启动打印的信息,可以看到启动时间、进程id、线程id、日志打印函数是在哪个函数中被调用的、还有日志级别,最重要的还有启动的端口
2016-08-12 09:21:02
664
1
原创 diy数据库(十一)--diydb的运行时模块
一、运行时模块(RNT) 运行时模块是真正的业务处理模块,用于处理解析完成后的请求。它主要依赖索引模块(IXM)和数据管理模块(DMS)来处理请求。上层模块不能绕过RNT来调用IXM和DMS中的功能。《diy数据库(一)--概况》中对模块间的关系有比较清楚的说明。二、RNT的实现好吧,diydb的RNT实现非常简单,代码是最好的解释Rtn.hpp#ifnd
2016-07-08 21:03:35
675
原创 diy数据库(十)--索引
一、什么是索引1、索引是一类用于快速定位目标数据的数据结构,索引的本质就是减少I/O次数(如果索引在磁盘上),或者减少读写次数(如果索引在内存上)。2、常见的索引有B树索引、B+树索引、散列索引等(1)B树索引 B树索引的定义不必多言,我们需要知道的关键一点就是:B树是一个多叉平衡查找树。我们知道在内存中组织有序数据一般会用红黑树,红黑树是一种平衡二叉树,那为什么
2016-07-08 20:17:39
635
原创 diy数据库(九)--diydb的数据持久化和存储格式
一、数据持久化 diydb是一个实际上是文档型数据库(并不是内存型数据库),他需要将数据持久化,那么就需要 读写磁盘上的数据。怎样读写磁盘上的数据更高效呢?目前linux上的方法就是使用mmap,即内存映射机制。 为什么说mmap高效呢?我们知道,当我们在进程中读文件时,一般都是先将磁盘上的文件的相应数据块复制到进程的内核空间,然后从内核空间将需要的数据复制到用户
2016-07-08 15:30:01
2381
原创 libevent总结(下)
八、统一定时器事件和信号事件详解 和信号事件相比,把定时器事件和I/O事件统一起来就变得十分容易了,为什么?因为I/O复用机制如select(),poll(),epoll_wait()都允许设置一个最大等待时间^_^。So,让我们来看看libevent是怎样做的吧。PS:实际上很多事件驱动的软件都是这样做的。1.实现方法 核心就是在每次事件循环中设置I/O复
2016-06-21 21:02:43
11349
1
原创 diy数据库(八)--客户端和服务器之间的通信协议
一、什么是通信协议通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。二、diydb的协议格式1、协议格式是通信协议中最重要的部分之一,diydb采用的是自定义格式和BSON格式的混合格式2、协议格式总览协议主要分三个大段(1)协议头:包括消息长度(用于读取一个完整的协议包)和消息类型(2)协议主体:不同的消息类型对应不同的协议主体,协议主体主
2016-06-17 14:20:45
7234
原创 diy数据库(七)--线程控制块、消息、线程池
一、概述 diy数据库使用的是一个多进程and多线程的服务器模型。每个进程作为一个节点实例,监听一个端口;而每个用户连接在数据库节点实例中都会有一个代理线程与之对应。
2016-06-16 15:53:38
4279
原创 github项目管理记录
一、在github或者git.china.os上创建一个项目,例如lora二、在本地安装好git三、本地对项目的管理1、将github上项目克隆到本地git clone https://git.oschina.net/superlike/lora.git如果在github上新建的项目lora是空项目,则不用克隆2、查看远程项目like@like:~/Git/qtcomTes
2016-05-26 18:36:51
1023
原创 关于source insight上中文乱码的问题
使用source insight查看源码非常方便,这一点毋庸置疑。但是在中文的输入和显示上又总是让人很烦。个人经验是在ubunutu下面,source insight不支持中文输入,然后源文件中的中文注释在source insight中打开的时候经常显示乱码。这里,针对source insight的中文显示问题的解决方案做个总结。 在此之前,必须明确一点,source insi
2016-05-13 11:59:15
3160
原创 libevent总结(中)
五、事件处理框架 libevent的事件处理框架是一个反应堆模型,而反应堆模型的核心就是IO复用。拿epoll来说,反应堆模型有两个核心数据结构,一个是epoll维护的内核事件表,一个是保存激活事件的事件队列。当然,值的注意的是,如果是单线程或者单进程,反应堆模型一定是IO复用+异步IO,否则无法保证及时响应。下面,将分析事件注册和事件删除的具体细节。1.event_base
2016-05-04 20:53:24
5346
1
原创 diy数据库系列(引言)
最近学习了一下EmeraldDB,所以想以此为蓝本重写一个数据库,从而加深自己对EmeraldDB的理解,也提升一下自己的服务器编程能力。重写的数据库命名为DiyDB。一、DIY数据库的主要特点1.支持分区存储,即数据库中的数据被散列到数据库集群的各个节点上。2.数据交格式为JSON,数据的底层存储格式为BSON。3.可对数据进行插入,搜索与删除二、DIY数据库开发需要
2016-04-18 20:36:04
540
原创 diy数据库(六)--信号和内核控制块
一、信号发送信号的方式:Shell– kill命令向指定进程发送信号系统调用– kill系统调用向指定进程发送信号– raise系统调用向当前进程发送信号信号处理函数:(1)有默认、忽略和自定义三种(2)两种特殊信号无法被处理:SIGKILL、SIGSTOP(3)信号处理函数执行时可以屏蔽指定的信号,使到来的信号挂起(4)一个线程对一个锁加多次(
2016-04-18 20:24:10
766
原创 diy数据库(五)--文件操作、问题诊断和配置文件
前言:对于一个服务器程序,他们一般运行在后台,基本上都是以daemon进程的形式存在,他们没有终端资源,不能用命令行与用户进行交互。这个时候,配置文件(当然服务进程启动时可以读取命令行参数)和日志文件的作用就显得不可或缺了。一、文件操作基础类typedef oss_off_t offsetType ;//文件偏移类型class ossPrimitiveFileOp{public
2016-04-18 15:37:03
663
转载 boost的配置解析库
介绍程序参数项(programoptions)是一系列name=value对,program_options允许程序开发者获得通过命令行(commandline)和配置文件(configfile)获取这些参数项。为什么需要这样一个库?为什么比你手工写代码分解命令行参数要好?使用更容易。定义参数处理的语法简单,库自身很小。像转换参数值到指定的类型和保存参数值到变量的事情都是自
2016-04-18 14:54:01
1639
原创 diy数据库(四)--锁和队列
一、锁的概述1.互斥锁 用来保证临界资源被互斥访问。2.读写锁 在一个线程中,当一个读写锁中的读锁被申请后,其他线程可以再申请读锁,但不能申请写锁。 在一个线程中,当一个读写锁中的写锁被申请后,其他线程不能申请读锁,也不能申请写锁。3.自旋锁 等待条件时,不让出cpu。nginx中由于每个工作进程要求快速响应用户,就用到了
2016-04-18 10:00:33
659
原创 diy数据库(三)--客户端框架的搭建
一、客户端框架的概述 在diy数据库(一)中,已经对客户端的框架有了一个基本的介绍。他主要负责从命令行读取用户的输入,然后将输入解析成数据库服务器能够识别的命令通过tcp连接发送给数据库服务器,并且处理数据库服务器返回的结果。 值的注意的是,我们的客户端用到了工厂模式。所有已经实现的命令都必须注册到命令工厂中,然后所有命令都必须从命令工厂去get到。二、类图说明
2016-04-17 23:19:30
946
原创 diy数据库(二)--网络通信类
一、首先,我们先实现OSS层的ossSocket类,供数据库客户端和数据库引擎进行通信友情提示:对应上面的类图的头文件和源代码附在了本文的最下面。int _fd ;//socket的文件描述符socklen_t _addressLen ;//地址长度socklen_t _peerAddressLen ;//对方地址的长度struct sockaddr_in _sockAdd
2016-04-17 15:27:06
1317
原创 diy数据库(一)--概况
一、概况。 diydb是一个非关系型数据库,在数据增长迅速的今天,关系型数据库在处理大量数据时的性能劣势被放大,这导致了noSQL数据库的快速发展,我们熟悉的如redis,memcache,mongodb等。这里,开发一个非关系型数据库来练手,一方面是因为非关系数据库很流行,另一方面是因为其数据处理逻辑更简单,且具备一个服务器的五脏六腑,有很多值得学习和借鉴的地方。二、
2016-04-15 16:44:16
3577
原创 c++二叉树的各种遍历
[cpp] view plain copy print?//节点的数据结构 class BTree { public: int m_nValue; BTree* m_nLeft; BTree* m_nRight; public: BTree(int value) { m_nValue = value; } };
2016-04-05 20:36:37
642
原创 libevent总结(上)
最近想手动重写一下某精简版的文档型数据库,所以想借鉴一下libevent的事件机制。之前也看过libevent的部分代码,但长时间不用已经忘的干净了。今天借此机会温习一下libevent,在此写个总结。一、简介libevent的最大看点是事件驱动和跨平台,当然还有轻量级。但是,其核心绝对是事件驱动机制。libevent的事件分为I/O事件,定时器事件和信号事件。二、使用的简
2016-04-05 14:47:26
2425
转载 autotools
手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然是一件好事。在Linux系统开发环境中,GNU Autotools 无疑就充当了这个重要角色。(在Windows系统的开发环境中,IDE工具,诸如Visual Studio,来管理项目也很方便。) 本文以一个简单项目为例子,来讲述GNU Autotools的一列工具及其命令的用法。aut
2016-04-03 21:26:47
330
转载 二叉树的公共节点
找寻二叉树中两个节点的公共父节点中最近的那个节点 情况1. 节点只有left/right,没有parent指针,root已知情况2. root未知,但是每个节点都有parent指针情况3. 二叉树是个二叉查找树,且root和两个节点的值(a, b)已知 虽然情况一是第一个情况,但是看上去比较复杂,我们放到最后来说,先从第二个
2016-03-31 20:34:44
594
原创 实现一个线程池
一.线程最主要的三个同步机制1.信号量2.互斥锁3.条件变量二.对三个同步机制分别实现一个包装类#ifdef LOCKER_H#define LOCKER_H#include #include /*信号量的封装*/class sem{public: sem() { if( sem_init( &sem_like, 0, 0
2016-03-31 19:43:36
491
转载 关于TCP_NODELAY和TCP_CORK选项
关于TCP_NODELAY和TCP_CORK选项 这两个选项都对网络连接的行为具有重要的作用。许多UNIX系统都实现了TCP_NODELAY选项,但是,TCP_CORK则是Linux系统所独有的 而且相对较新;它首先在内核版本2.4上得以实现。此外,其他UNIX系统版本也有功能类似的选项,值得注意的是,在某种由BSD派生的系统上的 TCP_NOPUSH选项其实就是TCP_COR
2016-03-02 16:37:13
431
原创 nginx架构总结--nginx源码系列(一)
总述: nginx自身是高度模块化设计的,我们可以方便的开发任何基于tcp的模块(比如http模块,mail模块)。 注: 一、开发一个nginx模块,必须遵守的原则有:1、实现模块开发的接口 2、不能有阻塞的系统调用 二、web服务器提高网络效率的方法有:1、使用长连接(keepalive)代替短连接,减少建立、关闭连接带来的开销
2016-01-10 22:20:48
2807
空空如也
nginx加入第三方模块后,编译通过,但启动时报错
2015-10-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人