C++ Project 积累(2)

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* 句柄

原文地址:https://www.cnblogs.com/zhouzhuo/p/3687250.html