分类: LINUX
2015-10-29 21:49:05
struct bpf_program fcode; /*存放已经编译好的过滤表达式*/
获取网络接口(网卡)后,我们需要打开它:
pcap_t * pcap_open_live(const char * device, int snaplen, int promisc, int to_ms, char * errbuf)
功能:获得数据包捕获描述字
上面这个函数会返回指定接口的pcap_t类型指针,后面的所有操作都要使用这个指针。第五个参数是存放出错信息的数组。
GetMacFromDevice函数下的htons(0x0806)是指ARP协议。
IFNAMSIZ = IF_NAMESIZE = 16.
ioctl选项SIOCGIFHWADDR是获取MAC地址,SIOCGIFADDR是获取网卡IP地址。
pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
功能: 从interface或离线记录文件获取一个报文
参数: p: 已打开的捕捉实例的描述符
pkt_header: 报文头
pkt_data: 报文内容
返回值: 1: 成功
0: 获取报文超时
-1: 发生错误
-2: 获取到离线记录文件的最后一个报文
Base64字符的最小单位是四个字符一组(也就是三个字节)
Base64编码:
static
void FillBase64Area(char area[])
{
uint8_t version[20];
const char Tbl[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"; // 标准的Base64字符映射表
uint8_t c1,c2,c3;
int i, j;
// 首先生成20字节加密过的H3C版本号信息
FillClientVersionArea(version);
// 然后按照Base64编码法将前面生成的20字节数据转换为28字节ASCII字符
i = 0;
j = 0;
while (j < 24)
{
c1 = version[i++];
c2 = version[i++];
c3 = version[i++];
// 第一个6位只需要让8位二进制右移两位
area[j++] = Tbl[ (c1&0xfc)>>2 ];
// 第二个6位 = 第一个8位的后两位 + 第二个8位的前4位area[j++] = Tbl[((c1&0x03)<<4)|((c2&0xf0)>>4) ];
// 第三个6位 = 第二个8位的后4位 + 第三个8位的前2位
area[j++] = Tbl[ ((c2&0x0f)<<2)|((c3&0xc0)>>6)];
// 第4个6位 = 第三个8位的后6位
area[j++] = Tbl[ c3&0x3f ];
}
c1 = version[i++];
c2 = version[i++];
area[24] = Tbl[ (c1&0xfc)>>2 ];
area[25] = Tbl[((c1&0x03)<<4)|((c2&0xf0)>>4)];
// 需补两个6位,一个是最后一个8位的后4位补两个0,另一个对应异常的“=”
area[26] = Tbl[ ((c2&0x0f)<<2)];
area[27] = '=';
}
感谢以下参考源:
http://blog.csdn.net/htttw/article/details/7521053
http://blog.csdn.net/headmaster110/article/details/7601296
http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html
http://blog.chinaunix.net/uid-502148-id-2392462.html
http://blog.sina.com.cn/s/blog_6cb117430100lz7q.html