1. 定制 pcap_dump
pcap_dump 用于将数据包写入磁盘, 配合 pcap_open_dead 可以将写入文件转化为 wireshark 可读格式
但这个函数缺少一个参数, 应提供 append 和 write 选项
经过彻底的搜索, 发现靠 winpcap 的 API 是无法满足我的需求, 因此只能定制 pcap_dump, 则这正是我一直想避免的.
于是, 重新研究 PCAP 文件格式.
PCAP 文件格式是 Pcap_file_description Pcap_header Packet Pcap_header Packet ….
无论是 Pcap_file_description 还是 Pcap_header 在 pcap.h 中都有定义, 可以直接使用
Pcap_file_descritption 大小为 24 字节, Pcap_header 为 16 字节. 注意, 网络字节流顺序, 下面是个实现
FILE* create_pcap_file(const char* filename, int linktype) {
struct pcap_file_header fh;
fh.magic = 0xa1b2c3d4;
fh.sigfigs = 0;
fh.version_major = 2;
fh.version_minor = 4;
fh.snaplen = (1<<16)-1;
fh.thiszone = 0;
fh.linktype = linktype;
FILE *file = fopen(filename, "wb");
if(file != NULL) {
if(fwrite(&fh, sizeof(fh), 1, file) != 1) {
fclose(file);
file = NULL;
} else {
fclose(file);
file = NULL;
}
}
return file;
}
int write_pcap_packet(FILE* file,pcap_pkthdr *header, const unsigned char *data, size_t length) {
if(fwrite(header, sizeof(pcap_pkthdr), 1, file) != 1) {
return 1;
}
if(fwrite(data, 1, length, file) != length) {
return 2;
}
return 0;
}
2. 类内 const 的作用
以前在书上学到过, const 变量必须在初始化列表中. 一直不太理解为什么 const 的变量可以再构造函数中初始化.
这种状况出现的原因是别人提供的 API 仅返回 const 类型的返回值, 导致自己的 class 构造函数的参数也必须是 const 类型
3. fwrite 与 fopen
fwrite 是将 block 写入磁盘
int main ()
{
FILE * pFile;
char buffer[] = { 'x' , 'y' , 'z' };
pFile = fopen ("myfile.bin", "wb");
fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
fclose (pFile);
return 0;
}
wb 是写入二进制的意思
fopen 可以以多种参数打开文件, 比如 w, a, r, wb, ab 等等
fputs 可以输出 string 到
与 freopen 重定向输入输出流不同, 每次对文件的操作都需要 FILE* 句柄