模拟网络流量特征的自动提取(第二次更新)

来源:互联网 发布:淘宝定位在哪里设置 编辑:程序博客网 时间:2024/06/11 08:50
#include<iostream>#include<map>#include<cstdlib>#include<fstream>#include<string>//#define sfn 5 //fn为初始网流的数量#define pn 1 // pn为一个网流中网包的数量#define n  40 //n为一个网包中载荷信息的数量int sfn, fn;//因为pn和n不是动态的所以不用定义初始值using namespace std;struct flow {  //flow即为网流    int  packet[pn][n];//网流矩阵};struct location {    //location为可以作为特征值的位置    int x, y;};flow * stmp; //定义动态网流数组map<int, int>M[pn][n]; //pn,n可以看为位置信息//该map用于计算在每一个位置下出现的各个字符的数量void init(int fum) {    string t;    string add;    string res;    int count = 0;    ifstream in("11.txt");    ofstream out("sad.txt");    if(!in)        cout << "error" << endl;    else {        int i;        for(i = 0; i < fum;) {            while(t.size()) {                add += t;                getline(in, t, '\n');            }            if(add.size() >=3 * n) {                res = "";                i++;                for(int j = 0; j < n * 1.5; j++)                    res += add[j];                int size = add.size();                for(int k = size - n * 1.5; k < size; k++)                    res += add[k];                out << res << endl;                out << endl;            }            add = "";            while(!t.size())                getline(in, t, '\n');        }    }    out.close();    in.close();}int getRow() {    string t;    int count = 0;    ifstream in("sad.txt");    if(!in)        cout << "error" << endl;    else        while(getline(in, t, '\n'))            if(t.size() > 0) {                // cout << t.size() << endl;;                // cout<<t<<endl;                count++;            }    in.close();    return count;}void input() {    sfn = fn = getRow();    //cout << fn << endl;    ifstream in("sad.txt");    if(!in) cout << "error" << endl;    stmp = (flow *)malloc(sizeof(flow) * fn);    for(int i = 0; i < fn; i++)        for(int j = 0; j < n; j++)            in >> hex >> stmp[i].packet[0][j];    in.close();}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.7 && double(maxn) / sfn >= 0.8) { //val就可以作为网流的特征值,在第一次聚类的时候a即为最小支持度也为最小置信度设为0.5        cout << dec << x << " " << y << endl;        cout << maxn << endl;        cout << hex << 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<max;i++)         {           for(int j=0;j<n;j++)            cout<<hex<<atmp[i].packet[0][j]<<' ';            cout<<endl;         }*/        //cluster atmp的话 出来的特征就是&        cluster(atmp, max);        //if btmp也满足条件        //cluster btmp的话 出来的特征就是|        //cluster(btmp,fn-max);    }}int main() {    init(50);  //init里面的参数为网流的个数,将原始数据处理    input();  //从sad里面读取数据    /* for(int i=0;i<fn;i++)     {        for(int j=0;j<n;j++)          cout<<hex<<stmp[i].packet[0][j]<<' ';          cout<<endl;     }     */    cluster(stmp, fn);    return 0;}

LGhher
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子做错事家长不道歉怎么办 孩孑语文成绩差怎么办 高三了孩子不愿意补课怎么办 四年级的孩子上课喜欢讲小话怎么办 五年级孩子太叛逆怎么办 二年级话唠孩子怎么办 家有老人带孩子怎么办 不会看孩子。孩子一哭就害怕怎么办 孩子不老实爱动怎么办 4周孩子脾气大怎么办 老公脾气暴躁爱骂人怎么办? 当妈妈了脾气不好怎么办 父亲很坏不顾家很会赌钱怎么办 妈妈骂我很难听怎么办 父母管的太严怎么办 2岁宝宝哭闹不止怎么办 8岁儿童叛逆期怎么办 两岁宝宝叛逆期怎么办 4个月小孩哭怎么办 2个月孩子爱哭怎么办 小孩挑衅大人被大人打怎么办 在学校犯了错怎么办 孩子在学校爱捣乱怎么办 小孩老是在学校捣乱怎么办 孩子不听话每天会发火怎么办 孩子不听话控制不住发火怎么办 儿子不听话我总会发火怎么办 小孩好动精力不集中怎么办 孩子好动精力不集中怎么办 一岁半宝宝咳嗽半个月了怎么办 6岁儿童上课调皮怎么办 小孩挨揍后精神失控怎么办 孩子不听话把我胃气疼了怎么办 因为孩子不听话夫妻经常吵架怎么办 11岁儿子不听话了怎么办 二十岁的儿子还不听话怎么办 幼儿园小班幼儿不听老师的话怎么办 幼师对待不听话的孩子该怎么办 2岁宝宝不吃饭只喝奶怎么办 孩子哭着喊妈妈不睡觉怎么办 孩子晚上不睡觉一直哭怎么办