【问题标题】:WinPcap creating empty .pcap fileWinPcap 创建空的 .pcap 文件
【发布时间】:2020-07-15 06:51:15
【问题描述】:

你知道如何用winpcap dll创建空文件pcap吗?我在程序内存中缓冲过滤后的数据包,并希望在用户单击导出到 .pcap 文件时保存。

但是当使用 pcap_open_offline(const char *fname, char *errbuf) 时,只有当文件存在时才能打开文件。我之前尝试过 fopen 和其他函数来创建文件(也以二进制模式)但没有成功。

那么如何通过这种方式获取 pcap_dump_open(pcap_t *p, const char *fname) 的 pcap_t 句柄指针?

更新: 我尝试使用此代码

fileHandle = pcap_open_offline(pcap_file_path.c_str(), errbuf);
if (errbuf == nullptr) {
    fprintf(stderr, "\nUnable to open the file %s.\n", pcap_file_path.c_str());
    return 1;
}

if (fileHandle == nullptr) {

    fprintf(stderr, "\nError to open file\n");//HERE IT FAILS
    return 1;
}

dumpfile = pcap_dump_open(fileHandle, pcap_file_path.c_str());
if (dumpfile == NULL)
{
    fprintf(stderr, "\nError opening output file\n");
    return 1;
}

解决方案:(Creating a pcap file)

/*create fake handle*/
fileHandle = pcap_open_dead(DLT_EN10MB, 65535);
if (fileHandle == nullptr) {
    fprintf(stderr, "\nError to open file\n");
    return 1;
}

/* Open the dump file */
dumpfile = pcap_dump_open(fileHandle, file_path.c_str());
if (dumpfile == NULL)
{
    fprintf(stderr, "\nError opening output file\n");
    return 1;
}

【问题讨论】:

  • 我不知道任何 pcap 功能,但也许您必须创建一个所需大小的文件,即使用 fopen/ofstream/etc 创建一个文件并写入一些字节,直到文件足够大。
  • pcap_t 句柄与接口或现有 保存文件相关联。因此,在您的情况下,您必须使用 pcap_open 或 pcap_create/pcap_activate 将您未来的转储与接口相关联。
  • omuffat:但是在我没有打开任何设备的情况下,如何使用pcap_open、pcap_create呢?如果离线,我想保存到文件中。当应用 pcap_open_offline(const char *fname, char *errbuf) 并且 fname 中指定的文件不存在时,它返回 NULL。

标签: c++ c pcap winpcap


【解决方案1】:

你知道如何用winpcap dll创建空文件pcap吗?我在程序内存中缓冲过滤后的数据包,并希望在用户单击导出到 .pcap 文件时保存。

...

那么如何通过这种方式获取 pcap_dump_open(pcap_t *p, const char *fname) 的 pcap_t 句柄指针呢?

pcap_dump_open() 返回一个pcap_dumper_t * 句柄供写入文件时使用; pcap_t * 用于捕获读取,而不是写入

如果你想一个 pcap 文件,你需要做的是使用pcap_dump_open()。如果您有一个 pcap_t * 来读取或捕获过滤后的数据包,则应在对 pcap_dump_open() 的调用中使用该 pcap_t *

【讨论】:

  • 是的,但是我在获取 pcap_t* 时遇到了问题,因为我没有它。我将捕获的数据包存储在内存中,并最终在用户需要时保存。其离线保存到文件中。
  • "我无法获得 pcap_t*,因为我没有它。"是的你是;这就是你从pcap_open_offline() 得到的。 “我将捕获的数据包存储在内存中,并最终在用户需要时保存。”读完数据包后不要关闭pcap_t *;当用户想要将数据包保存到文件时,请保持打开状态。
  • 我有来自 pcap_open_offline() 的 NULL,因为文件不存在。我不想因为加载 .pcap 之类的程序逻辑而使其始终处于打开状态,并将其另存为另一个 .pcap。我不明白为什么会出现这样的问题,它只是文件操作,如果没有创建文件,则创建文件,这与 C 或 C++ 中的流有关。
  • "我有来自 pcap_open_offline() 的 NULL,因为文件不存在。"然后您无法从中读取任何数据包以写入另一个文件。 “我不想因为加载 .pcap 之类的程序逻辑而使其始终处于打开状态,并将其另存为另一个 .pcap。”然后您必须保存其链路层类型和快照长度,并使用pcap_open_dead() 创建一个pcap_t,并将其与pcap_dump_open() 一起使用。 “我不明白为什么会出现这样的问题”这是因为用于写入文件的pcap API设计得不好。
  • "那么你将不得不保存它的链路层类型和快照长度,并使用 pcap_open_dead() 创建一个 pcap_t,并将其与 pcap_dump_open() 一起使用。"如何指定link_type,这个函数做什么(例子)?是否可以使用此功能创建 pcap 文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2019-07-23
  • 2014-07-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多