第二次运行tshark.c源文件后出现致命错误

时间:2019-03-01 15:19:23

标签: c++ c wireshark tshark wireshark-dissector

我想从源文件(即以{em> C 语言编写的tshark.c)运行 Tshark解剖器,而不是使用terminal和以下命令:

tshark -r my.pcap ...

因此,我将tshark.c的主要功能更改为:

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(...)之前,我可能不知道怎么做,这是第二种重置所有事物的方法。每个人都可以告诉我解决方案吗?

1 个答案:

答案 0 :(得分:1)

  

什么是正确的调用?

正确的调用是不要尝试两次运行main函数,因为它将尝试两次注册文件类型读取器,并为您提供相关的错误消息。

这是与this ask.wireshark.org问题相同的问题,答案是相同的。