2011-05-11 2 views
0

여기에 enter_data 파일의 데이터를 복사하여 insert (key, keys) 함수로 전달하려고합니다.하지만 세그먼트 오류가 발생하고 그 이상이 발생합니다. 분류는 구조이며, packet_filter 내가fread를 사용하면서 파일에서 데이터를 읽을 수 없다면 세그먼트 화 오류가 발생했습니다

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); 
    } 
SRC와 DST의 IP Address가 생깁니다 및 SRC와 DST 포트 번호를 입력합니다 점에서 IP와 UDP의 구조를 가지고

여기에 파일에서 데이터를 읽을 수 없습니다입니다


    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; 

+0

당신이 segfault의 정확 인 위치를 결정하는 데 그 코드에 디버거를 실행하려고 적이 있습니까? –

+1

두 번째 게시물이 파일이면이 코드는 작동하지 않습니다. 이진 직렬화를 사용하여 읽으려고하지만 파일이 텍스트 파일입니다. – Chad

답변

1

파일이 텍스트 인 동안 이진 파일을 읽으므로이 방법은 작동하지 않습니다.

두 번째 - 파일을 열려고 시도한 후 fpNULL인지 확인해야합니다. 조언 만하면됩니다.

셋째 - 파일이 진 경우에도,이 keys으로

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

가 배열이 아닌 있어야한다

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

로, 작동하지 않을 것입니다 그리고 당신은 블록을 읽을 필요 .

+1

"단지 조언"이라고하는 이유를 모릅니다. fopen이 성공했는지 확인하는 것은 필수적입니다. 이를 확인하지 않으면 프로그램을 사용할 수 없게됩니다. –

+0

@ 윌리암 - 단지 "너무 열심히"소리를 내고 싶지 않았다. : D 프로그래머의 책임 ** 항상 ** 사용 된 함수의 리턴 코드를 확인하는 것 (당연히 있다면) –

-1

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); 
} 
+0

. 이것은 바이너리 파일을 위해 작동 할 것이고, 텍스트 파일이라고 보입니다. –

+0

네, 단 하나의 구조를 가지고 있지만 같은 구조체에 다른 데이터를 입력하고 구조체를 계속 통과시켜야 어떻게 할 수 있습니까? – sandeep

+0

@sandeep : 열쇠를 하나씩 삽입하는 루프로 답변을 편집했습니다. –

관련 문제