У меня есть приложение C ++, в котором я запускаю другой процесс (wireshark) что-то вроде следующего.
if (fp == NULL){
fp = popen(processpath, "r"); //processpath is the process I want to start
if (!fp){
throw std::invalid_argument("Cannot start process");
}
fprintf(fp, d_msg);//d_msg is the input I want to provide to process
} else if(fp != NULL){
fprintf(fp, d_msg);
}
Проблема в том, что когда я запускаю свое приложение на c ++, оно запускает wireshark, но с ошибкой End of File on pipe magic during open
что я должен сделать, чтобы избежать этого?
Также я попытался с помощью mkfifo создать именованный канал и выполнить его. Я использовал что-то вроде этого:
if (fp == NULL){
system("mkfifo /tmp/mine.pcap");
fp = popen("wireshark -k -i /tmp/mine.pcap", "r");
if (!fp){
dout << "Cannot start wireshark"<<std::endl;
throw std::invalid_argument("Cannot start wireshark");
}
input = fopen("/tmp/mine.pcap", "wb");
fprintf(input , d_msg);
fclose(input);
} else if(fp != NULL){
input = fopen("/tmp/mine.pcap", "wb");
fprintf(input , d_msg);
fclose(input);
}
Но это тоже не сработало. При этом я получаю следующую ошибку:
The file "/tmp/wireshark_mine.pcap_20130730012654_ndbFzk" is a capture for a network type that Wireshark doesn't support
Любая помощь будет оценена.
Большое спасибо.
Проблема в том, что когда я запускаю свое приложение на c ++, оно запускает wireshark, но с ошибкой
End of File on pipe magic during open
что я должен сделать, чтобы избежать этого?
Вы должны написать файл pcap или файл pcap-ng к трубе, а не fprintfing что-то.
Оба этих формата файлов двоичный. Если вы создаете свои собственные пакеты, вам нужно будет создать и записать в канал действительный заголовок файла pcap или несколько допустимых блоков pcap-ng (блок заголовка раздела и хотя бы один блок описания интерфейса), прежде чем вы сможете написать какие-либо пакеты, и затем для каждого пакета вам нужно будет написать заголовок pcap для каждого пакета или начало а также конец расширенного пакетного блока pcap-ng перед (и для расширенного блока после) необработанными пакетными данными. Если вы просто отправляете существующий файл в Wireshark, вам нужно будет прочитать необработанные байты из файла и отправить эти необработанные байты по конвейеру.
Других решений пока нет …