-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathppp.cpp
More file actions
161 lines (156 loc) · 2.92 KB
/
Copy pathppp.cpp
File metadata and controls
161 lines (156 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include<iostream>
#include<string>
#include<cstdlib>
#include<ctime>
using namespace std;
//帧定界符
#define flag "01111110"
//首部无用字符
#define none "1111111100000011"
//首部协议
#define agreement "0000000000100001"
//CRC-16的除数为11000000000000101
#define CRC_16 "11000000000000101"
//随机生成50字节IP数据报,共400位
string IPData()
{
//更新随机数种子,保证每次的随机数不同
srand((unsigned)time(NULL));
string data="";
char perData=' ';
for(int i=1;i<=400;i++)
{
perData=rand()%(1-0+1)+0+48;
data=data+perData;
}
return data;
}
//零比特填充法
string zeroBitFill(string data)
{
//从0开始查找第一个“11111”的位置
int index=data.find("11111",0);
//如果能够查找到
while(index!= data.npos)
{
//在“11111”的后面加0
string midstr1=data.substr(0,index+5);
string midstr2=data.substr(index+5);
data=midstr1+"0"+midstr2;
//查找下一个“11111”
index=data.find("11111",index+5);
}
return data;
}
//字符填充
string stringFill(string data)
{
//从0开始查找第一个“01111110”的位置
int index=data.find("01111110",0);
//如果能够查找到
while(index!= data.npos)
{
//将“01111110”(7E)的转换为"01111011 01011110"(7D 5E)
string midstr1=data.substr(0,index);
string midstr2=data.substr(index+8);
data=midstr1+"0111110101011110"+midstr2;
//查找下一个“01111110”
index=data.find("01111110",index+16);
}
return data;
}
//模2加减
char mod2_add_sub(char a,char b)
{
//相当于异或
if((a=='0' &&b=='0')||(a=='1' &&b=='1'))
{
return '0';
}
else
{
return '1';
}
}
//模2除法
string mod2_division(string a,string b)
{
for(int i=0;i<b.length()-1;i++)
{
a=a+"0";
}
//长度
int alength=a.length();
int blength=b.length();
//运算次数
int n=alength-blength+1;
string shang=b;
//除法运算
for(int i=0;i<n;i++)
{
for(int k=0;k<blength;k++)
{
a[k]=mod2_add_sub(a[k],shang[k]);
}
a=a.substr(1);
if(a[0]=='0')
{
shang="";
for(int j=0;j<blength;j++)
{
shang=shang+"0";
}
}
else
{
shang=b;
}
}
return a;
}
//根据CRC冗余校验生成FCS
string FCS_CRC(string data)
{
string fcs="";
fcs=mod2_division(data,CRC_16);
return fcs;
}
//生成PDU,参数n说明,n=1时零比特填充,n=2时字符填充
string PDU(string ipData,int n)
{
string pdu="";
//首部
pdu=flag;
pdu=pdu+none;
pdu=pdu+agreement;
//ip数据报
//时零比特填充
if(n==1)
{
pdu=pdu+zeroBitFill(ipData);
}
//字符填充
else if(n==2)
{
pdu=pdu+stringFill(ipData);
}
//尾部
//FCS
pdu=pdu+FCS_CRC(ipData);
//帧定界
pdu=pdu+flag;
return pdu;
}
int main()
{
cout<<"生成的IP数据报为:"<<endl;
string data=IPData();
cout<<data<<endl;
cout<<endl;
cout<<"处理后的pdu帧(0比特填充)为:"<<endl;
cout<<PDU(data,1)<<endl;
cout<<"处理后的pdu帧(字符填充)为:"<<endl;
cout<<PDU(data,2)<<endl;
system("pause");
return 0;
}