这里想要复制文件enter_data中的数据并将其传递给函数insert(key,keys)但是我得到了一个分段错误,而且我无法从文件中读取数据
这里分类器是一个结构,而packet_filter有ip和udp的结构,我想输入src和dst ip adddress和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;
答案 0 :(得分:1)
这不起作用,因为您尝试读取二进制文件,而您的文件是文本。
第二 - 在尝试打开文件后,您需要检查fp
是否为NULL
- 只是一个建议。
第三 - 即使文件是二进制文件,这也不行,如
fread(&keys, sizeof (struct classifier), 3, fp);
应该是
// vvv
fread(&keys, sizeof (struct classifier), 1, fp);
由于keys
不是一个数组,你只需要在块上阅读。
答案 1 :(得分:-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);
}