用C语言实现对冗余层发送的数据包进行过滤判断处理

绝大多数的安全设备都是按照2oo2结构设计的,两块相同的板卡,当二者的输出相同时,才为真,作为最终的结果。

由于二者发送数据不同步,接收设备经常会接收到双份的重复数据,如何对重复的数据进行过滤判断,现在实现一下接口程序。


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define GM_BOOL       int
#define MAX_ListNum   10                 /*定义链表中结点的最大个数  */
#define GM_TRUE       1
#define GM_FALSE      0
#define GM_UINT32     int
/*定义链表的结点*/
typedef struct list 
{   
int num;
struct list *next;
}node;
typedef struct data /*定义数据包格式*/
{
int dataID;
/*其他数据部分*/
}Data_MSG;


node *ListRearInsert(node *head,int stud);/*链表尾部插入结点函数     */
node *ListDelete(node *head,int num);     /*删除链表中某特定的结点函数*/ 
node *ListHeadDelete(node *head);         /*删除头结点             */
GM_BOOL DataFilter(Data_MSG *data,node *p1);
node *ListFindNode(node *head, int num);  /*寻找链表结点函数*/


node *ListRearInsert(node *head,int stud)/*在链表的尾部插入结点*/
{
node *p1,*p2;
p1 = head;
p2 = (node *)malloc(sizeof(node));/*开辟一个新的空间*/
p2->num = stud;

if(head ==NULL)         /*如果链表为空       */
{
head = p2;
p2->next = NULL;
printf("插入:%d 作为链表的一个结点\n",stud);
}
else
{
while( p1->next!=NULL )
{
p1= p1->next;
}
/*此时p1为链表的尾结点*/
p1->next = p2;    /*将p2结点插入p1后面  */
p2->next = NULL;
}
return head;
}


/*在链表中删除某个结点函数*/
node *ListDelete(node *head,int num) 
{
node *p1,*p2;              /*p1指向当前结点,p2为当前结点的前一结点,p2->next=p1*/
if(head == NULL)           /*如果链表为空的话*/
{
printf("\nlist null!\n");
return head;
}
p1 = head;       
while((num!=p1->num) && (p1->next!=NULL)) /*从头结点开始遍历,若p1指向的内容不是头结点,并且后面还有结点*/
{
p2 = p1;        /*相当于p2和p1一起向后移动,p2为p1的前一个结点*/
p1 = p1->next;  /*p1向后移动*/
}
if(num == p1->num ) /*找到了要删除的结点*/
{
if(p1 == head)  /*若要删除的结点是首结点,把第二个结点地址赋值给头结点*/
head = p1->next;
else            
p2->next = p1->next; /*否则将下一结点地址赋值给前一结点的地址*/
printf("delete :%ld\n",num);
}
else
printf("%ld not been found!\n",num);
return head;
}


/*删除链表的头结点函数*/
node *ListHeadDelete(node *head) 
{
node *p1;              /*p1指向当前结点,p2为当前结点的前一结点,p2->next=p1*/
if(head == NULL)           /*如果链表为空的话*/
{
printf("\nlist null!\n");
return head;
}
else
{
p1 = head;       
head = p1->next;
return head;
}
}


/*寻找结点函数*/
node *ListFindNode(node *head, int IDnum)
{
node *p1, *p2 = NULL; /*p2存放该结点地址,并初始化*/
p1 = head;
if(NULL == head)
{
p2 = p1;    /*返回值为空,没有找到*/
}
else
{
while(p1 != NULL )
{
if(p1->num == IDnum)
{
break;/*说明此时找到该结点*/
}
p1 = p1->next;
}
p2 = p1;/*找到该节点,也可能链表中没有该结点(p2==NULL)*/
}
return p2;
}


/*数据包过滤函数*//*要求链表的前期为链表的插入*/
GM_BOOL DataFilter(Data_MSG *data,node *p2)
{
GM_BOOL result = GM_FALSE;


static GM_UINT32 nodenum = 0;       /*nodenum中存放链表中结点数目*/
static node *p1 = p2;
if(NULL ==  ListFindNode(p1,data->dataID))/*链表中没有该结点,链表为空或者链表中没有该结点*/
{
p1 = ListRearInsert(p1,data->dataID);/*为空插入结点*/
printf("%d 该数据包未被过滤\n",data->dataID);
nodenum++;
if(nodenum > MAX_ListNum)      /*若链表中的数据大于100个结点,认为此时是单系在工作*/
{
p1 = ListHeadDelete(p1);        /*删除链表中的第一个结点*/
nodenum--;
printf("此时链表中结点个数为:%d\n",nodenum);
}
result = GM_FALSE;
}
else                                 /*链表不为空,在链表中找到了该结点*/
{
p1 = ListDelete(p1,data->dataID);/*删除该节点*/
printf("%d 该数据包已过滤\n",data->dataID);
nodenum--;
result = GM_TRUE;          /*该节点已被过滤过*/
}
return result;
}

void main()
{
int i = 0;
Data_MSG data[20];
node *p1 = NULL,*p2;  /*定义一个空链表*/
node *head = p1;  /*链表的头指针  */
/*将数据包存储到一个结构体数组中*/
for(i = 0;i<MAX_ListNum;i++)
{
printf("请输入数据包:%d的标示符数\n",i+1);
scanf("%d",&((data+i)->dataID));
printf("\n");
}
for(i = 0;i<MAX_ListNum;i++)
{
DataFilter(data+i,p1);/*由于p1一直不变,p1=NULL*/
}
}

猜你喜欢

转载自blog.csdn.net/yuhoujiangnan2011/article/details/49685043