ошибка сегментации при использовании fread и не в состоянии прочитать данные из файла - PullRequest
0 голосов
/ 11 мая 2011

Здесь нужно скопировать данные из файла enter_data и передать их функции insert (ключ, ключи), но я получаю ошибку сегментации и, более того, я не могу прочитать данные из файла

здесь классификатор является структурой, а packet_filter имеет структуру ip и udp, в которой я хочу ввести адрес src и dst ip и номер порта src и dst

    struct classifier
    {
        int key_node;
        struct packet_filter pktFltr;
        struct classifier *next;
    }__attribute__((packed));




    void addrule(struct classifier keys)
    {
            int key;
            FILE *fp;
            fp = fopen("enter_data","r");
            fread(&keys, sizeof (struct classifier), 3, fp);
            insert(key,keys);
            fclose(fp);
    }

                    file: enter_data

        key = 822;
        keys.key_node = 822;
        inet_aton("172.28.6.137", &(keys.pktFltr.ip.ip_src));
        inet_aton("172.28.6.10",&(keys.pktFltr.ip.ip_dst));
        keys.pktFltr.protocol.proto.uh_sport = ntohs(1032);
        keys.pktFltr.protocol.proto.uh_dport = ntohs(5000);
        keys.next = NULL;


        key = 522 ;
        keys.key_node = 522;
        inet_aton("172.28.6.87", &(keys.pktFltr.ip.ip_src));
        inet_aton("172.28.6.110",&(keys.pktFltr.ip.ip_dst));
        keys.pktFltr.protocol.proto.uh_sport = ntohs(1032);
        keys.pktFltr.protocol.proto.uh_dport = ntohs(5010);
        keys.next = NULL;

        key = 522 ;
        keys.key_node = 522;
        inet_aton("172.28.6.87", &(keys.pktFltr.ip.ip_src));
        inet_aton("172.28.6.110",&(keys.pktFltr.ip.ip_dst));
        keys.pktFltr.protocol.proto.uh_sport = ntohs(1032);
        keys.pktFltr.protocol.proto.uh_dport = ntohs(5011);
        keys.next = NULL;

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Это не будет работать, потому что вы пытаетесь прочитать двоичный файл, в то время как ваш файл является текстовым.

Второй - вам нужно проверить, если fp равно NULL после попытки открыть файл - простосовет.

В-третьих, даже если файл был двоичным, это не сработало бы, так как

fread(&keys, sizeof (struct classifier), 3, fp);

должно быть

//                                      vvv
fread(&keys, sizeof (struct classifier), 1, fp);

Как keysне массив, и вам нужно читать только на блоке.

0 голосов
/ 11 мая 2011

Вы, кажется, не выделяете достаточно места для ваших 3 ключей.

void addrule(struct classifier keys)
{
....
    fread(&keys, sizeof (struct classifier), 3, fp);    // Here you read 3 keys and put into &keys, but you gave only one struct to your method

Может быть, с циклом, читающим по одному ключу на каждом:

void addrule(struct classifier keys)
{
....
    while fread(&keys, sizeof (struct classifier), 1, fp)
    {
        insert(key,keys);
    }
    fclose(fp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...