目录
题目要求:
模拟从各种客户端访问一个网站
1)随机生成ip地址
2)记录不同ip地址的数量
ip地址分类方式:
Class A: 0.0.0.0 – 127.255.255.255
Class B: 128.0.0.0 – 191.255.255.255
Class C: 192.0.0.0 – 223.255.255.255
Class D: 224.0.0.0 – 239.255.255.255
Class E: 240.0.0.0 – 247.255.255.255
代码实现:
源.cpp:
#include<iostream>
#include<fstream>
#include<iomanip>
#include<windows.h>
#include<ctime>
#include"Client.h"
using namespace std;
int cnt[5];
void getData(fstream &x)//随机生成一组数据
{
int a, b, c, d, f, g, h, i, j;
a = rand() % 256;
b = rand() % 256;
c = rand() % 256;
d = rand() % 256;
f = rand() % 12 + 1;
g = rand() % 30 + 1;
h = rand() % 24;
i = rand() % 60;
j = rand() % 60;
Client clientData(a, b, c, d, 2022, f, g, h, i, j);
x.write(reinterpret_cast<const char*>(&clientData), sizeof(Client));
clientData.printAddress();
cout << " ";
clientData.printDate();
cout << " ";
clientData.printTime();
cout << endl;
}
int main()
{
fstream outData("data.dat", ios::out | ios::binary);//创建一个fstream对象,打开一个文件以二进制输出
if (!outData)
{
cerr << "File could not be oppened" << endl;
exit(EXIT_FAILURE);
}
srand(0);
for (int i = 0; i < 100; i++)
{
getData(outData);
}
outData.close();//在不使用文件时立刻关闭文件
ifstream inData("data.dat", ios::in | ios::binary);
Client clientData;
if (!inData)
{
cerr << "File could not be oppened" << endl;
exit(EXIT_FAILURE);
}
inData.read(reinterpret_cast<char*>(&clientData), sizeof(Client));//以二进制形式读取文件
while (inData && !inData.eof())//用ios函数判断是否达到文件末尾
{
if (clientData.fAddress() >= 0 && clientData.fAddress() < 128) cnt[0]++;
else if (clientData.fAddress() >= 128 && clientData.fAddress() < 192) cnt[1]++;
else if (clientData.fAddress() >= 192 && clientData.fAddress() < 224) cnt[2]++;
else if (clientData.fAddress() >= 224 && clientData.fAddress() < 247) cnt[3]++;
else if (clientData.fAddress() >= 247 && clientData.fAddress() < 256) cnt[4]++;
inData.read(reinterpret_cast<char*>(&clientData), sizeof(Client));//以二进制形式读取文件
}
inData.close();
cout << "\nNumber of class A addresses: " << cnt[0] << endl
<< "Number of class B addresses: " << cnt[1] << endl
<< "Number of class C addresses: " << cnt[2] << endl
<< "Number of class D addresses: " << cnt[3] << endl
<< "Number of class E addresses: " << cnt[4] << endl;
system("pause");
return 0;
}
ps :时间戳我随便设定的,可以自己改改
Client.h:
#pragma once
class Client
{
public:
Client(int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0, int = 0);
void setAddress(int, int, int, int);
void setyear(int);
void setmonth(int);
void setday(int);
void sethour(int);
void setminute(int);
void setsecond(int);
void printAddress();
void printDate();
void printTime();
int fAddress();
private:
int address[4];
int year, month, day, hour, minute, second;
};
Client.cpp:
#include "Client.h"
#include<iomanip>
#include<iostream>
using namespace std;
Client::Client(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
{
setAddress(a, b, c, d);
setyear(e);
setmonth(f);
setday(g);
sethour(h);
setminute(i);
setsecond(j);
}
void Client::setAddress(int a, int b, int c, int d)
{
address[0] = a;
address[1] = b;
address[2] = c;
address[3] = d;
}
void Client::setyear(int x)
{
year = x;
}
void Client::setmonth(int x)
{
month = x;
}
void Client::setday(int x)
{
day = x;
}
void Client::sethour(int x)
{
hour = x;
}
void Client::setminute(int x)
{
minute = x;
}
void Client::setsecond(int x)
{
second = x;
}
void Client::printAddress()
{
cout << address[0] << "." << address[1] << "." << address[2] << "." << address[3];
}
void Client::printDate()
{
cout << year << "-" << setw(2) << setfill('0') << month << "-" << setw(2) << setfill('0') << day;//如果个位小于十需要补零
}
void Client::printTime()
{
cout << setw(2) << setfill('0') <<hour << ":" << setw(2) << setfill('0') << minute << ":" << setw(2) << setfill('0') << second;
}
int Client::fAddress()
{
return address[0];
}