glib中文手册 http://gtk-doc-cn.googlecode.com/svn/docs/glib/index.html
参考:http://blog.chinaunix.net/uid-21241717-id-88013.html
http://www.cnblogs.com/ouuy/archive/2011/11/18/2254396.html
http://blog.csdn.net/myaccella/article/details/7298014
http://footprint.blog.163.com/blog/static/173871127200661972544308/
交叉编译。。
http://blog.csdn.net/keminlau/article/details/4945951
glib 交叉编译。。
http://blog.csdn.net/wavemcu/article/details/12352651
libtool autoconf 工具:http://www.laruence.com/2009/11/18/1154.html
http://www.cnblogs.com/welkinwalker/archive/2011/06/27/2091506.html
http://www.ibm.com/developerworks/cn/linux/l-makefile/
-------------
echo ac_cv_type_long_long=yes>$$ARCH-linux.cache && \
echo glib_cv_stack_grows=no>>$$ARCH-linux.cache && \
echo glib_cv_uscore=no>>$$ARCH-linux.cache && \
echo ac_cv_func_posix_getpwuid_r=yes>>$$ARCH-linux.cache && \
./configure --host=$$ARCH-linux --prefix=$$PREFIX --cache-file=$$ARCH-linux.cache
---------
2.3.2 主要用户接口及实现原理
pcap_open_live()
为网卡设备名创建并初始化pcap_t抓包句柄,pcap_t结构体的成员包含了后续抓包所需要的各种操作函数,以及抓包参数;
其实现原理如下:
调用socket()创建用于抓包的套接字描述符;
调用ioctl()获取网卡设备的接口索引;
调用bind()绑定网卡设备的接口索引到抓包套接字描述符;
调用setsockopt()为后续抓包设置报文接收缓冲区长度;
pcap_compile()
将用户输入的抓包过滤表达式字符串编译为内核可识别的BPF伪机器码
其实现原理如下:
根据语法规则调用yyparse()函数,对用户输入的表达式进行语法分析, 并对每一个逻辑谓词分割的"语句"进行词法分析,
以语句为单位编译为BPF伪机器码, 最后根据逻辑谓词整合;
pcap_setfilter()
将编译好的BPF过滤程序下发到内核;
其实现主要调用setsockopt()的SO_ATTACH_FILTER选项将bpf过滤程序安装到内核
pcap_dispatch()
将抓取的原始数据报传给用户自定义的回调函数;
其实现主要调用recvmsg()接收内核上送的原始报文数据
2.3.3 libpcap库的修改和移植
修改
将libpcap用户接口基于网络设备抓包,改为基于接口名抓包, 涉及到的函数有:
pcap_open_live();
iface_get_id();
iface_get_arptype();
...
以及所有通过ioctl获取网络接口属性信息的调用, 均替换为V7接口管理模块提供的专用接口:
GetIfIndexByIfName() 和 GetDataByIfIndex();
移植
libpcap源码包本身支持交叉编译; 移植过程分3步:
1) 为交叉编译器所在路径配置PATH环境变量
export PATH=/opt/x86-uclibc-cross-v179/bin;$PATH
2) 执行 ./configure --build=i386-unknown-gnu-linux \
--host=i686-gnu-linux \
CFLAGS= ... \
LDFLAGS= ... \
LIBS= ... \
CPPFLAGS= ...
3) 如果顺利, 会在configure脚本所在目录下, 生成config.h 和 Makefile
执行sudo make 最终生成V7平台需要的libpcap.so 动态库;