249 lines
5.4 KiB
C
249 lines
5.4 KiB
C
#include "ip_file.h"
|
||
#include "link.h"
|
||
#include <netinet/in.h>
|
||
#define ip_config_name "ip_config"
|
||
|
||
//与main.c共用一个结构体指针变量,保存过滤IP链表头节点
|
||
MY_ROU * roulink_head = NULL;
|
||
|
||
//--------------------操作文件中的过滤IP----------------------//
|
||
void init_ip_link()
|
||
{
|
||
FILE *ip_config = NULL;
|
||
ip_config = fopen(ip_config_name,"rb+");
|
||
if(ip_config == NULL){
|
||
perror("!!!configure file,in main.c");
|
||
_exit(1);
|
||
}
|
||
puts("filter IP:");
|
||
int i = 0;
|
||
while(1)
|
||
{
|
||
|
||
char buff[500]="";
|
||
bzero(buff, sizeof(buff));
|
||
int ip;
|
||
if(fgets(buff, sizeof(buff), ip_config) == NULL)
|
||
{
|
||
printf("ip_config 文件为空\n");
|
||
break;
|
||
}
|
||
if(strlen(buff) < 7)//1.1.1.1
|
||
{
|
||
break;
|
||
}
|
||
buff[strlen(buff)-1]=0;//注意文件中存在\r
|
||
//printf("IP[%d] = %s\n",i++,buff);
|
||
inet_pton(AF_INET, buff, &ip);
|
||
|
||
MY_ROU *pb = (MY_ROU *)malloc(sizeof(MY_ROU));
|
||
char ip_buf[16] = "";
|
||
inet_ntop(AF_INET, &ip, ip_buf, 16);
|
||
//printf("ip_buf[%d] = %s\n", ++i, ip_buf);
|
||
//strcpy(pb->ip, ip_buf);
|
||
memcpy(pb->ip, ip_buf, 16);
|
||
printf("pb->ip[%d] = %s\n", i, pb->ip);
|
||
|
||
//传入变化的头节点 + 带有IP信息的结构体指针变量
|
||
roulink_head = inner_ip_link(roulink_head, pb);
|
||
i++;
|
||
}
|
||
|
||
//rou_print_link(ip_head);
|
||
fclose(ip_config);
|
||
}
|
||
|
||
MY_ROU *inner_ip_link(MY_ROU *head, MY_ROU* p)
|
||
{
|
||
|
||
// head = (MY_ROU*)malloc(sizeof(MY_ROU)); //创建头结点
|
||
// head->next = NULL;
|
||
MY_ROU * pb = head;
|
||
int a = rou_searcharpLink(head, p->ip);//查找是否有该记录
|
||
if(a == 0)
|
||
{
|
||
if(pb==NULL)
|
||
{//未查找到,插入链表,直接插入表头方便
|
||
p->next = NULL;
|
||
head = p;
|
||
}
|
||
else
|
||
{
|
||
#if 1 //头插法--寻找插入的节点
|
||
MY_ROU * p2_new = (MY_ROU*)malloc(sizeof(MY_ROU));
|
||
strcpy(p2_new->ip, p->ip);
|
||
// printf("继续头插!!!!p2_new->ip = %s!!!!!!\n",p2_new->ip);
|
||
p2_new->next = pb->next;
|
||
pb->next = p2_new;
|
||
#endif
|
||
#if 0 //尾插法--正确
|
||
MY_ROU *p1=pb;
|
||
while(p1->next!=NULL)
|
||
{
|
||
p1=p1->next;
|
||
}
|
||
//插入
|
||
p1->next=p;
|
||
#endif
|
||
}
|
||
}
|
||
return head;
|
||
}
|
||
|
||
void save_ip_link()
|
||
{
|
||
FILE *ip_config = fopen(ip_config_name,"wb+");
|
||
if(ip_config == NULL){
|
||
perror("!!!configure file,in main.c");
|
||
_exit(1);
|
||
}
|
||
|
||
char buff[20]="";
|
||
MY_ROU *pb=roulink_head;
|
||
while(pb != NULL)
|
||
{
|
||
printf("!保存2命令输入IP\n");
|
||
memcpy(buff, pb->ip, 16);//一次拷贝16个字节
|
||
buff[strlen(buff)+1]='\n';//注意文件中存在\r
|
||
|
||
//一个IP新切换一行保存到文件
|
||
fprintf(ip_config, "%s\n", buff);
|
||
pb = pb->next;
|
||
}
|
||
fclose(ip_config);
|
||
}
|
||
//--------------------操作文件中的过滤IP----------------------//
|
||
|
||
|
||
|
||
|
||
//*************************过滤链表******************************//
|
||
//尾插
|
||
MY_ROU *rou_pTailInsert(MY_ROU *head)
|
||
{
|
||
|
||
//申请一个待插入的空间
|
||
MY_ROU *pi=(MY_ROU*)malloc(sizeof(MY_ROU));
|
||
pi->next=NULL;
|
||
printf("输入过滤ip:");
|
||
//向空间中插入数据
|
||
scanf("%s",pi->ip);
|
||
//判断是否有数据
|
||
if(head==NULL)
|
||
{
|
||
head=pi;
|
||
}
|
||
else
|
||
{
|
||
//寻找插入的节点
|
||
MY_ROU *p1=head;
|
||
while(p1->next!=NULL)
|
||
{
|
||
p1=p1->next;
|
||
}
|
||
//插入
|
||
p1->next=pi;
|
||
}
|
||
|
||
|
||
printf("设置完成\n");
|
||
return head;
|
||
}
|
||
|
||
//遍历
|
||
void rou_print_link(MY_ROU *head)
|
||
{
|
||
if(head==NULL)
|
||
{
|
||
printf("没有数据\n");
|
||
}
|
||
else
|
||
{
|
||
while(head!=NULL)
|
||
{
|
||
printf("ip:%s\n",head->ip);
|
||
head=head->next;
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
//释放链表
|
||
MY_ROU* rou_freeLink(MY_ROU *head)
|
||
{
|
||
MY_ROU *pd;
|
||
pd=head;
|
||
while(head!=NULL)
|
||
{
|
||
head=pd->next;
|
||
free(pd);
|
||
pd=head;
|
||
}
|
||
printf("过滤链表释放完毕\n");
|
||
return head;
|
||
}
|
||
|
||
//查找ip
|
||
int rou_searcharpLink(MY_ROU *head,char *ip)
|
||
{
|
||
MY_ROU * pb = head;
|
||
int i=0;
|
||
while(pb!=NULL)
|
||
{
|
||
if(strcmp(ip, pb->ip)==0)
|
||
{
|
||
i++;
|
||
//printf("存在相同ip\n");
|
||
return 1;
|
||
}
|
||
pb = pb->next;
|
||
}
|
||
if(0==i)
|
||
{
|
||
//printf("未找到ip\n");
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
//删除
|
||
MY_ROU *rou_pDeleteLink(MY_ROU *head)
|
||
{
|
||
char num[16]="";
|
||
MY_ROU *pe=head;
|
||
MY_ROU *pf=head;
|
||
|
||
printf("请输入你要删除的ip:");
|
||
scanf("%s",num);
|
||
|
||
if(NULL==head)
|
||
{
|
||
printf("无可删除数据\n");
|
||
}
|
||
else
|
||
{
|
||
while(strcmp(pe->ip,num))
|
||
{
|
||
pf=pe;
|
||
pe=pe->next;
|
||
if(NULL==pf->next)
|
||
{
|
||
printf("未找到要删除数据\n");
|
||
return head;
|
||
}
|
||
}
|
||
|
||
if(pe==head)
|
||
{
|
||
head=pe->next;
|
||
free(pe);
|
||
}
|
||
else
|
||
{
|
||
pf->next=pe->next;
|
||
free(pe);
|
||
}
|
||
}
|
||
return head;
|
||
}
|
||
//*************************过滤链表******************************
|
||
|