模拟网络流量特征的自动提取(第一次大致算法框架)

  LGhher

#include<iostream>
#include<map>
#include<cstdlib>

#define sfn 5 //fn为初始网流的数量
#define pn 1 // pn为一个网流中网包的数量
#define n  2 //n为一个网包中载荷信息的数量

int fn=sfn;
//因为pn和n不是动态的所以不用定义初始值
using namespace std;
struct flow {  //flow即为网流
    int  packet[pn][n];//网流矩阵
};
struct location{     //location为可以作为特征值的位置
     int x,y;
};
flow *stmp=(flow *)malloc(sizeof(flow)*fn);
map<int, int>M[pn][n]; //pn,n可以看为位置信息

//该map用于计算在每一个位置下出现的各个字符的数量

void input() {

    stmp[0].packet[0][0] = 3;
    stmp[0].packet[0][1] = 7;
    stmp[1].packet[0][0] = 3;
    stmp[1].packet[0][1] = 7;
    stmp[2].packet[0][0] = 3;
    stmp[2].packet[0][1] = 7;
    stmp[3].packet[0][0] = 4;
    stmp[3].packet[0][1] = 8;
    stmp[4].packet[0][0] = 3;
    stmp[4].packet[0][1] = 10;

}
int maxn = 0, x, y, val; //x,y,val分别最横坐标,纵坐标以及频率最高的值
void frequency(flow *tmp,int i, int j, int k) {

    int num = tmp[k].packet[i][j];
    if(M[i][j].count(num)) //判断num这个特征有没有在坐标(i,j)这个位置出现过
        M[i][j][num]++;
    else
        M[i][j][num] = 1;
    if(M[i][j][num] > maxn) {
        x = i;
        y = j;
        maxn = M[i][j][num];
        val = tmp[k].packet[i][j];
    }

}
void cluster(flow *tmp,int fn) {

  maxn=0;
    for(int i = 0; i < pn; i++)
        for(int j = 0; j < n; j++)
            M[i][j].clear();

    for(int i = 0; i < pn; i++)
        for(int j = 0; j < n; j++)
            for(int k = 0; k < fn; k++)
                if(tmp[k].packet[i][j]>=256)
                   continue;
                else
                frequency(tmp,i, j, k);
    if(double(maxn) / fn > 0.5) { //val就可以作为网流的特征值,在第一次聚类的时候a即为最小支持度也为最小置信度设为0.5
        cout << double(maxn) / fn << endl;
        cout << x << " " << y << endl;
        cout << maxn << " " << val << endl;
        int max=maxn;
        //假如maxn和fn-maxn都满足继续分层聚类的条件,动态分配maxn个数组和fn-maxn个数组用于分层聚类
    /*
    for(int k=0;k<fn;k++)
     if(tmp[k].packet[x][y]==val)
     将第k个网流赋给maxn大小的数组中其中一项
     else
     将第k个网流赋给fn-maxn大小的数组其中一项

     然后继续将这个两个网流聚类
     */
     //atmp为下方的网流,btmp为有右方的网络
    flow *atmp=(flow *)malloc(sizeof(flow)*max);
    flow *btmp=(flow *)malloc(sizeof(flow)*(fn-max));
    int i1=0,j1=0;
   for(int k=0;k<fn;k++)
     if(tmp[k].packet[x][y]==val)
         atmp[i1++]=tmp[k];
     else
         btmp[j1++]=tmp[k];

         free(tmp);

   for(int k=0;k<max;k++)//x,y这个位置已经为特征值,+256为了下次不再计算此位置
      atmp[k].packet[x][y]+=256;
   /*  for(int i=0;i<maxn;i++)
    cout<<atmp[i].packet[0][0]<<" "<<atmp[i].packet[0][1]<<endl;
    */
     //cluster atmp的话 出来的特征就是&
    cluster(atmp,max);
     //if btmp也满足条件
    //cluster btmp的话 出来的特征就是|
     cluster(btmp,fn-max);


        }
    }
int main() {

     input();

    cluster(stmp,fn);

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值