Я автомобильный инженер.Я пытаюсь перехватить сообщение по протоколу CAN автомобиля и использовать анализ Wireshark.Там нет способа захватить прямо из машины.Поэтому я пишу демо, чтобы проверить, можно ли его импортировать из конвейера.Это сработало.Но я нажимаю кнопку перезагрузки, появляется всплывающее сообщение «Нераспознанный формат libpcap».каждый раз, когда я хочу очистить Wireshark, я не могу перезапустить машину.Что мне делать?
вот демо
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#pragma pack(1)
struct pcap_file_header {
uint32_t magic = 0xa1b2c3d4;
uint16_t version_major = 2;
uint16_t version_minor = 4;
uint32_t thiszone = 0;
uint32_t sigfigs = 0;
uint32_t snaplen = 0x40000;
uint32_t linktype = 1;
};
struct pcap_pkthdr {
uint32_t sec;
uint32_t usec;
uint32_t caplen = 12;
uint32_t len = 12;
uint32_t id; //CAN protocol field
uint64_t data; //CAN protocol field
};
#pragma pack()
int main(){
struct pcap_file_header pfh;
struct pcap_pkthdr pph;
char command[] = "wireshark -k -i -";
int pipefd[2];
if(pipe(pipefd) < 0){
perror("pipe error:");
return -1;
}
pid_t pid;
switch (pid = fork()) {
case -1:
close(pipefd[0]);
close(pipefd[1]);
perror("fork error:");
return -1;
case 0:
if (pipefd[0] != STDIN_FILENO) {
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[0]);
}
int ret = execl("/bin/sh", "sh", "-c", command, NULL);
if(ret < 0) {
perror("execlp error:");
}
exit(0);
}
FILE *f = fdopen(pipefd[1], "w");
close(pipefd[0]);
fwrite(&pfh, 1, sizeof(pfh), f);
while(1) {
size_t len = fwrite(&pph, 1, sizeof(pph), f);
fflush(f);
sleep(1);
}
return 0;
}