zoukankan      html  css  js  c++  java
  • 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* 句柄

  • 相关阅读:
    WPF简单的分页控件实现
    WPF常用样式总结
    树:重建二叉树
    从尾到头打印链表
    字符串替换空格
    二维数组中的查找
    C#中转换运算符explicit、implicit、operator、volatile研究
    泛型实现常用算法
    .NET架构师知识普及
    .NET中扩展方法和Enumerable(System.Linq)
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3687250.html
Copyright © 2011-2022 走看看