При перезапуске текущего живого захвата с использованием PIPE появляется всплывающая ошибка «Нераспознанный формат libpcap». - PullRequest
0 голосов
/ 03 декабря 2018

Я автомобильный инженер.Я пытаюсь перехватить сообщение по протоколу 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;
}
...