programming in lua (4)

第 7 章。这一章看得不是很明白。

迭代器可以遍历一个集合中的所有元素。在 lua 中,迭代器一般都是函数,每次调用这个函数都会返回集合中的“下一个”元素,前面提到的闭包函数就是实现迭代器的很好选择:

function values (t)
   local i = 0
   return function ()
      i = i + 1
      return t[i]
   end
end

arr = {"one", "two", "three"}

iter = values(arr)
while true do
   local e = iter()
   

阅读全文…

使用 libpcap 分析网络报文 (2)

这里打算写写报文分析接口的设计。 一般来说,以太网的报文格式为:

+------------+-------------------+-----+
| eth header | ip/arp/... header | ... |
+------------+-------------------+-----+

例如手机上的一次网页请求的报文格式可能像下面这样:

+-----+----+-----+-----+----+-----+--------------+
| eth | ip | udp | gtp | ip | tcp | http request |
+-----+----+-----+-----+----+-----+--------------+

不同的应用对于不同协议的内容可能会有不同的需求。比方说,一个应用希望抓取 gtp 报头中的 pdp context,以此建立起某个手机号在某段时间内使用的是哪个 ip 的映射,它不关心上层应用的内容;另一个应用希望抓取内层 ip …

阅读全文…

使用 libpcap 分析网络报文 (1)

最近要对 tcpdump 抓到的报文进行分析,开始的时候用 wireshark 的命令行工具 tshark 把分析的结果保存成文本文件然后再用正则表达式匹配需要的字段,这样好处是不用自己分析协议,只要抓取需要的字段就行了,缺点是相当地慢,330M 的 tcpdump 文件经过 tshark 处理后得到 5G+ 的文本文件,还要从这 5G+ 文本中做字符串匹配……

于是往下走一层,发现 wireshark 和 tcpdump 都使用了同样的库--libpcap,来实现抓包操作。对于抓包需要用到的 libpcap 函数并不多,主要是自己分析协议部分比较麻烦。网上找了些 libpcap 的资料,在这里总结一下。

简介(参考资料 [1])

libpcap 是一个 C 语言库,libpcap 的英文意思是 Packet Capture library,即数据包捕获函数库,其功能是通过网卡抓取网络以太网中的数据包。这个库为不同的平台提供了一致的 c 函数编程接口,在安装了 libpcap 的平台上,以 libpcap …

阅读全文…

pthread 学习笔记 (1)

pthread 是 POSIX Thread 的缩写,是一套标准线程库,大部分的 *nix 系统都实现了它,在 windows 上也有相应的实现。这里的实验环境为 debian 6.0。

并行和并发(参考资料 [1])

并行的英文是 parallelism,并发的英文是 concurrency,两者表达的意思并不一样:并行是指多条指令 同时 执行(这里的“同时”指时间上的同时),而并发是指多条指令可能以任意顺序执行(也有可能是并行执行)。

第一个 pthread 程序

#include <stdio.h>
#include <pthread.h>

static void* print_tid(void* arg)
{
   printf("thread id: %d\n", *((int*)arg));

   return arg;
}

#define THREAD_NR 10


阅读全文…

programming in lua (3)

5-6 章。

函数

函数是完成某一特定功能的语句集合。函数使用括号标识,括号内是传递给函数的参数。如果函数只有一个参数,且这个参数是一个字符串或者 table 的 constructor,那么括号是可选的,例如:

print("Hello")
print "hello"
print (type({x = 10, y = 20}))
print (type {x = 10, y = 20})

函数定义的语法是:

function func_name (parameter)
   body
end

如果括号中的参数多于 1 个用逗号隔开,如果没有参数就不用写。

给函数传递参数时,如果参数的个数比函数定义的个数少,则靠右的参数被赋值为 nil;如果传递的参数比函数定义的个数多,则多出来的值被忽略:

function func(a, b, c)
   

阅读全文…

git 使用笔记 (1)

记录一下实际使用过程中用到的命令和结果,不分解过程,也比较零散。详细的分析可以参考这本书:《Pro Git》

本地操作

要对某个目录进行版本控制,可以在该目录下执行命令(假设工作目录是 git-test,里面只有一个文件 a.txt):

git init

之后会看到提示:

Initialized empty Git repository in /path/to/git-test/.git/

在 git-test 目录下生成一个目录 .git,里面就是 git-test 的版本信息。git 只会在根目录下建立一个 .git 目录包含所有的信息,而不像 svn 一下在各个子目录下都建一个 .svn 目录。

建立了目录信息,但是 git 不会主动把目录下的所有文件或子目录都纳入版本控制中,必须手动添加要 git 进行版本控制的内容。如果要将 a.txt 加入版本控制,执行下面的命令:

git add a.txt

阅读全文…

programming in lua (1)

《programming in lua》第二版第 1-2 章。

运行环境

这里使用的 lua 版本是 5.1.4,操作系统是 debian 6.0,

到 lua 的官网下载源码包,因为是 ANSI C 写成的解析器,所以在各个平台上编译都很方便。编译之后会在源码目录里的 src 下生成两个可执行文件:lua 和 luac,其中 lua 用来解析脚本,luac 用来把脚本编译成二进制文件。在源码包里也带有一些例子,在 test 目录下。例如可以用下面的命令来运行 test 下的例子(假设当前目录为解压后的源码根目录):

./src/lua test/hello.lua

或者使用 luac 把脚本转换成二进制文件:

./src/luac test/hello.lua

默认的输出文件是 luac.out。接着可以使用 lua 来运行这个二进制文件:…

阅读全文…

qemu 的使用和配置

之前用的是低端本本,32 位的 u 还不支持 vt,虚拟机用的是 virtualbox,虽然挺好用,但是每次升级内核都得重新编译一遍模块,有时还不一定能编译过,所以尽管版本升到 4.0,一直在用的都是 1.6.6 版,虽然简陋点,但是写写文档用用网银还是能满足的。

买了新本第一时间就把 kvm 装上了。kvm 的全称是 kernel-based virtual machine,从 2.6.20 开始集成到内核中。不过 kvm 需要 cpu 的 vt 技术支持,图形性能也不如 virtualbox 和 vmware 的好,但是 cpu 和内存的占用个人感觉要比前两者好。

刚装的时候用的是深度的精简版 xp,结果风扇狂转,cpu 占用率 100%,这个和网上说的像打了鸡血一样不相符啊……到论坛去问了一下,发现是 iso 的问题,重新装了个 win7 就好多了。

要看 cpu …

阅读全文…

xpdf 配置笔记

先说一下系统环境是 debian 6.0.2,xpdf 版本是 3.0.2。

为神马要强调一下环境呢?因为以前用 kpdf 有乱码的时候可以装 xpdf-chinese-simplified(kpdf 是基于 xpdf 的,大概是 debian 4.0 的时候这个包还在),但是现在搜了一下已经没了,然后从网上下了一个 deb,安装的时候说要 xpdf-common 这个包,一搜又没有了(直接到源网站上可以找到,是 debian5 的版本,但是用 aptitude search 搜不到,应该是在 6 中被移除了)。

把 pdf 的背景颜色改为浅绿色(#cce8cf),这样看的时间长了眼睛不容易累,但是一直都没找到 evince 的修改 pdf 背景颜色的选项,想装回 kpdf 又找不到(kde4 的 pdf 阅读器已经改为 okular 了,功能强大,依赖的包也更多,装个看 pdf …

阅读全文…