Неустранимая ошибка после повторного запуска исходного файла tshark.c - PullRequest
0 голосов
/ 01 марта 2019

Я хочу запустить Tshark disctor из исходного файла (то есть tshark.c, который написан на C языке) вместо использования терминала и следующей команды:

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 голосов
/ 05 марта 2019

Что такое правильный вызов?

Правильный вызов - не пытаться запустить основную функцию дважды, поскольку она дважды попытается зарегистрировать средства чтения типов файлов и выдатьВы сообщение об ошибке в вопросе.

Это тот же вопрос, что и этот вопрос ask.wireshark.org , и ответ тот же.

...