- 博客(105)
- 资源 (7)
- 收藏
- 关注
原创 TCP 滑动窗口/TCP 接收和发送缓冲区/内核sock接收和发送缓冲区
一个socket在内核中有两个缓冲区,分别为接收和发送缓冲区。struct sock { …… struct sk_buff_head sk_receive_queue;—-接收队列 struct sk_buff_head sk_write_queue;——发送队列 …… }; 2. socket编程中可以通过以下API设置:setsockopt
2017-11-03 11:37:06
2794
3
原创 TCP/IP学习--------------- MSS
MSS(max segment size: 最大报文段长度):TCP 可以发送的最大数据长度, 不包括IP首部(20字节)和TCP首部(20字节)。 1. MSS 默认是536字节。 20字节IP首部 + 20字节TCP首部 + 536字节MSS = 576字节的IP数据报文 2. MSS一般为出口MTU值减去IP首部和TCP首部 如MTU为576字节, 则对应的MSS = 576-20
2017-11-03 10:26:24
1002
原创 基于字符串的分离链接hash算法
Hashes 问题:你有一个很大的字符串数组。需要知道另外一个字符串是否在这个字符串数组中。你可能会将这个字符串与数组中的字符串依次作比较。但是实际中,你会发现这种方法太慢。必须找其它的方法。但是除了依次比较字符串外,还有没有其它方法来知道某个字符串是否存在呢? 解决方案: Hashes。 Hashes是用小的数据类型(如,数字)来表示其它大的数据类型(通常是字符串)。
2017-10-25 14:56:03
379
原创 linux网桥处理函数学习------br_handle_frame_finish
/* note: already called with rcu_read_lock */int br_handle_frame_finish(struct sock *sk, struct sk_buff *skb){ const unsigned char *dest = eth_hdr(skb)->h_dest; struct net_bridge_port *p = br
2017-10-20 17:10:59
2720
原创 linux网桥处理函数学习-----br_handle_frame
/* * Return NULL if skb is handled * note: already called with rcu_read_lock */rx_handler_result_t br_handle_frame(struct sk_buff **pskb){ struct net_bridge_port *p; struct sk_buff *skb =
2017-10-20 15:32:55
2989
原创 libevent 事件的优先级队列
多个事件同时触发时,libevent每一定义各个回调函数的执行顺序。可以使用优先级来定义某些事件比其它事件更重要。libevent里面的优先级队列就是active队列数组,当epoll返回event时,根据event对应的优先级放入队列的active数组列表中,实现了优先级的概念 1. event_Base的优先级队列libevent中,每个event_base都有与之相关的一个或者多个优先级。
2017-09-26 15:51:58
2076
原创 git push 时常见错误
git push -u origin master------------------------------------------------------------------------------错误 1. -------------------------------------------------------------------------------er
2017-09-26 10:41:24
1576
原创 静态对象的初始化
//============================================================================// Name : StaticObjectsInFunctions.cpp// Author : gwwu// Version :// Copyright : Your copyright notic
2017-08-29 10:14:19
1196
原创 c++中的引用
//============================================================================// Name : FreeStandingReferences.cpp// Author : gwwu// Version :// Copyright : Your copyright notice
2017-08-28 17:01:24
759
原创 c++学习----const常量折叠
//============================================================================// Name : Constant_folding.cpp// Author : gwwu// Version :// Copyright : Your copyright notice// Des
2017-08-24 17:35:03
395
原创 C++中struct 和 class的sizeof大小
//============================================================================// Name : Sizeof.cpp// Author : gwwu// Version :// Copyright : Your copyright notice// Description :
2017-08-23 14:12:05
960
原创 First head 设计模式学习c++实现------模板方法模式(Template method pattern)
模板方法模式: 在一个方法中定义一个算法的骨架,而将一些步骤推迟到子类中。 /* * CaffeineBeverage.h * * Created on: Aug 16, 2017 * Author: gwwu */#ifndef CAFFEINEBEVERAGE_H_#define CAFFEINEBEVERAGE_H_#include <iostream>usin
2017-08-16 15:16:10
334
原创 linux shell命令查看接口索引--ip link show
AH-00c080:/tmp/home/admin$ ip link show1: lo: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: tunl0@NONE: mtu 1480 qdisc noop state DOWN
2017-08-03 17:57:18
8309
1
原创 __attribute__ ((packed)) 的作用
看到内核代码里面有attribute ((packed)) ,感觉比较奇怪,查了百度后知道其作用。 attribute ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如: 在T
2017-08-01 17:39:40
701
原创 C++ Vector size和capcity的增加方式
创建一个vector对象vector a;后, vector对象a的size和capacity都是0。 当插入第一个元素后,size和capacity都变为1 当插入第二个元素后,size和capacity都变为2 当插入第三个元素后,size变为3, 由于capacity为2,小于3, 则capacity=capacity*2,变成4 …… 当插入第五个元素后,size变为5, 由于ca
2017-07-14 16:06:15
3031
原创 自动创建proc文件
#include <linux/module.h> #include <linux/sched.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/uaccess.h> #include <linux/slab.h> typedef struct proc_private_data
2017-07-12 15:33:47
336
原创 自动注册/proc文件
static int counter_proc_show(struct seq_file *m, void *v){ seq_printf(m, linux_proc_banner, utsname()->sysname, utsname()->release, utsname()->release, utsname()->version); /* seq_printf(m
2017-07-12 15:28:46
337
原创 c++ Eclipse 中文乱码
c++ 代码使用Eclipse时,cout 输出中文时是乱码。修改:在Window->Preferences->General->Workspace 面板Text file encoding 选择UTF-8
2017-07-07 16:40:54
1252
原创 设计模式学习之------State模式(状态模式)
什么是状态模式状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 1. 这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。 2. 使用组合通过简单因为不同的状态对象来造成类改变的假象。 /* * IState.h * * Created on: Jul 4, 2017 * Author: gwwu
2017-07-06 16:25:29
247
原创 linux 内核学习----------模块(LKM:loading kernel module)
可加载内核模块(LKM)Linux内核是模块化组成的,允许内核在运行的时候以模块的形式动态地添加或删除代码。 优点:保证基本内核小,动态增加和删除module_init /module_exitmodule_init 将模块的入口函数注册到系统中 module_exit 将模块的出口函数注册到系统中加载/卸载模块最简单的加载方法是insmod命令, 一般要以root身份运行命令 insmod
2017-06-30 17:25:33
1236
原创 pthread_exit ---- 不能使用局部变量作为参数返回
在使用pthread_exit 返回一个void型指针,该指针指向的数据必须不能是线程内部的局部变量,因为随着线程的退出,局部变量被摧毁,变成不确定的内存内容了。 下面的程序比较了使用线程内部的局部变量和全局变量作为pthread_exit返回指针指向的数据内容。其中全局变量可以返回正确的值,而局部变量设置的值已经不一样了。#include <stdio.h>#include <stdlib.h
2017-06-27 17:54:32
1064
原创 pthread_exit-----在linux主线程中的用途
大家都知道在一个线程中调用pthread_exit表示退出一个线程,并且pthread_exit的参数作为返回值提供给pthread_join函数获取。 那么如果在main函数创建了若干个线程后,在main函数最后调用pthread_exit会怎么样呢?已经创建的线程会不会随着main线程的退出而退出呢? 如果在main函数中调用的是exit,那么答案是所有线程随着main线程退出而退出。 但
2017-06-27 17:18:00
3055
原创 查看linux下进程的环境变量
AH-3f7440:/tmp/root# ps | grep dhcpc 9528 root 47976 S /opt/ah/bin/dhcpc10595 root 2796 S grep dhcpcAH-3f7440:/tmp/root# tr '\0' '\n' < /proc/9528/environUSER=rootLD_LIBRARY_PATH=/l
2017-06-22 15:37:55
4748
原创 Libevent学习-------定时器事件
定时器事件的创建Libevent 一般调用evtimer_new来定义一个定时器事件#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))从宏定义来看,这个事件和io、signal事件的区别在于fd项为-1,表示并不关注, 并且events项为0, 并不是想象中的EV_TIMEOUT. evtimer_ne
2017-06-14 17:58:54
8517
原创 Libevent学习----信号事件
信号是一种异步事件:信号处理函数和程序的主循环是两条不同的执行路线。很明显,信号处理函数需要尽可能快地执行完毕,以确保该信号不被屏蔽太久(信号在处理期间,系统不会再次触发它)。 上面这幅图是网上找到的,很好地从整体上表述了原理,摘抄到最前面 下图是本人自己总结的信号事件代码级原理图 下面是展开分析代码实现一、初始化信号事件 调用base->evbase = base->evsel->
2017-06-09 16:00:34
1052
原创 Libevent 学习--------(eventop)事件多路分发器
一、事件多路分发器一般使用I/O复用接口。 Libvent中使用eventop 结构作为后端I/O复用的统一接口/** Structure to define the backend of a given event_base. */struct eventop {
2017-06-07 16:03:53
1982
原创 Libevent学习-----Reactor的事件处理机制
1. 普通函数的调用机制: 主程序调用某函数à函数执行,保存入参和返回寄存器地址,主程序等待à 函数处理完将结果和控制权返回给主程序 à主程序继续执行void func (){ return;}int main(int argc, char *argv[]){ int a,b;
2017-06-06 16:18:16
470
原创 libevent 学习----------尾队列 tail queue
libevent里面的尾队列TAILQ 一、TAILQ的队列头 TAILQ把整个队列头单独抽象为一个结构体TAILQ_HEAD,如下:#ifndef TAILQ_HEAD#define TAILQ_HEAD(name, type) \struct name {
2017-05-22 15:17:17
1598
1
转载 我读过的最好的epoll讲解--转自”知乎“
作者:蓝形参,Geek 伪技术宅 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客
2016-11-25 15:39:01
375
转载 Linux软连接和硬链接
原文链接 http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在
2016-08-03 14:40:26
424
转载 KMP 算法 ---经典
The Knuth-Morris-Pratt Algorithm in my own words(http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html)For the past few days, I’ve been reading v
2016-07-15 17:38:56
398
原创 数组中超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过了数组长度的一半,因此输出2.#include #include int check_more_than_one_half(int array[],int len,int value){ int i; in
2016-07-11 16:07:57
367
原创 快速排序中的partition算法
简介partition算法用途是:有一个数组array[]和其中任意一个数组元素x,修改数组,将数组中小于x的元素都移到x的左边,将大于x的元素都移动x的右边返回值: 返回值为最终x在数组中的索引值。void swap(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp;}int partition(int arr
2016-07-11 14:46:25
1043
原创 snort -------DEBUG_WRAP
在看snort源码的时候,经常看到调用DEBUG_WRAP函数输出的debug信息。研究了一下怎么打开这个debug开关,以下是具体的步骤1. 在configure 选项中添加--enable-debug-msgs 和--enable-debug ,这个打开了宏DEBUG_MSGS2.定义环境变量SNORT_DEBUG和SNORT_PP_DEBUG, debug_level = $SNOR
2016-07-01 15:55:40
970
原创 查看linux系统发行版信息
[root@localhost ~]# cat /etc/issueCentOS release 6.4 (Final)Kernel \r on an \m
2016-06-28 17:10:55
366
原创 CPU个数和核数的判断依据
一直听说多核,多cpu,但是一直没有具体明白怎么查看一台linux机器的这些信息。前段时间终于抽空学习了一下CPU个数和核数的判断依据: 1. physical id 个数为物理CPU的个数2. core id 个数为核数3. 逻辑CPU# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的
2016-06-28 17:06:05
2655
原创 centos安装snort
1. 安装libpcap与libpcap-devel yum install libpacp*2. 安装libpcre yum install pcre*3. 安装libnet 下载libnet (http://libdnet.sourceforge.net/) wget http://prdownloads.sourceforge.net/
2016-06-16 17:01:27
3802
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人