【发布时间】:2019-03-01 15:19:23
【问题描述】:
我想从源文件(即用C语言编写的tshark.c)运行Tshark dissector,而不是使用终端和以下命令: p>
tshark -r my.pcap ...
所以我将tshark.c main 函数从:
int
main(int argc, char *argv[])
{
return real_main(argc, argv);
}
到:
int
tshark_main(char arg0[],char arg1[],char arg2[],char arg3[],char arg4[],char arg5[],char arg6[],char arg7[])
{
int argc=8;
char* const argv[] = {arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,NULL};
return (real_main(argc, argv));
}
为了从另一个函数调用主函数。之后我
创建了一个由tshark.c 和其他依赖项组成的库,并制作了所需的包含文件,如下所示:
#ifndef __TSHARK_H__
#define __TSHARK_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef _WIN32
int
wmain(int argc, wchar_t *wc_argv[]);
#else
int
tshark_main(char arg0[], char arg1[], char arg2[], char arg3[], char arg4[], char arg5[], char arg6[], char arg7[]);
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* tshark.h */
在下一步中,我将提到的 lib 和 *.h 文件添加到我的 C++ 项目中并调用 tshark_main 函数如下:
char arg0[]="";
char arg1[]="-o";
char arg2[]="uat:user_dlts:\"User 0 (DLT=147)\",\"RRC.SI.SIB1\",\"0\",\"\",\"0\",\"\"";
char arg3[]="-r";
char arg4[]="my1.pcap";
char arg5[]="-V";
char arg6[]="";
char arg7[]="";
tshark_main(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7);
char arg4[]="my2.pcap";
tshark_main(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7);
但是,在tshark_main(...) 第二次调用(最后一行)中,出现如下致命错误:
** (process:8445): ERROR **: 18:05:33.070: file type short name already exists
我认为这个错误是因为源文件中定义的静态变量,当我第一次调用tshark_main(...) 时,一切正常,当我第二次或更多次调用它时,变量已经改变。由于 Wireshark 可以一遍又一遍地剖析数据包和文件,所以我需要一个初始化方法或类似的东西 wireshark 用来重置静态变量,但我不知道它在哪里。此外,在第二次调用tshark_main(...) 之前,可能有第二种方法可以重置所有内容,我不知道该怎么做。大家能告诉我解决办法吗?
【问题讨论】:
-
显然这不是你所做的,因为它无法编译。
-
@MatthieuBrucher 首先我创建了一个 C 项目并使用 C 编译器编译它并创建了一个库。其次,我创建了一个 C++ 项目,并使用我制作的 *.h 文件将该库添加到其中。之后我用 C++ 编译器编译了我的 C++ 项目。
-
@rustyx 谢谢,我知道这个错误出现在哪里。它来自 [github.com/wireshark/wireshark/blob/master/wiretap/…,其中
for循环中的wtap_num_file_types_subtypes应该是81,但第二次是82,dump_open_table[81].short_name是非法访问(因为dump_open_table的大小是81,dump_open_table元素索引的最大值是80)。正确的调用是什么? -
@rustyx 能给更多指导吗?
标签: c++ c wireshark tshark wireshark-dissector