DHCP服务器
自己写得比较繁琐,但可以AC
#include <iostream>
#include <string>
using namespace std;
class I
{
public:
string user;//使用该IP的发送主机名称
// int num;//ip地址
int state;//ip状态
int time;//IP过期时间
I()
{
user="";
// num=0;
state=0;
time=0;
}
};
int main()
{
//数据定义
int N,Tdef,Tmax,Tmin;
string H;
int n;
cin>>N>>Tdef>>Tmax>>Tmin>>H>>n;
string str1[n],str2[n],str3[n];
I p[N+1];
int IP[n],ti[n];
int T[n];
for(int i=0;i<n;i++)//输入数据
{
cin>>T[i]>>str1[i]>>str2[i]>>str3[i]>>IP[i]>>ti[i];
}
int sign =0;
// int sym =0;
for(int i=0;i<n;i++)//对每一个输入数据进行计算
{
if(str2[i]=="dhcp"||str2[i]=="*")
{
if(str3[i]!="DIS"&&str3[i]!="REQ")//排除掉无效输入
continue;
if((str2[i]=="*"&&str3[i]!="DIS")||(str2[i]=="dhcp"&&str3[i]=="DIS"))
continue;
for(int j=1;j<(N+1);j++)//重新计算各个IP的状态--根据时间
{
if(T[i]>=p[j].time)//如果过期
{
if(p[j].state==2)//占用状态
{
p[j].state=3;
p[j].time=0;
}
else if(p[j].state==1)//待分配状态
{
p[j].state=0;
p[j].user="";
p[j].time=0;
}
}
}
if(str3[i]=="DIS")//类型为DIS
{
sign=0;//标明状态
for(int j=1;j<(N+1);j++)//发送主机是占用者
if(p[j].user==str1[i])
{
IP[i]=j;
p[j].state=1;
sign=1;
if(ti[i]==0)//计算IP过期时间
p[j].time=T[i]+Tdef;
else
{
if( ti[i] > (T[i]+Tmax) )
p[j].time= (T[i]+Tmax) ;
else
{
if(ti[i]< (T[i]+Tmin) )
{
p[j].time=(T[i]+Tmin);
}
else
p[j].time=ti[i];
}
}
cout<<"dhcp "<<p[j].user<<" OFR "<<j<<" "<<p[j].time<<endl;
break;
}
if(sign==0)
for(int j=1;j<(N+1);j++)//最小未分配
if(p[j].state==0)
{
IP[i]=j;
p[j].user=str1[i];
p[j].state=1;
sign=1;
if(ti[i]==0)//计算IP过期时间
p[j].time=T[i]+Tdef;
else
if( ti[i] > (T[i]+Tmax) )
p[j].time= (T[i]+Tmax) ;
else
if(ti[i] < (T[i]+Tmin) )
{
p[j].time=(T[i]+Tmin);
}
else
p[j].time=ti[i];
cout<<"dhcp "<<p[j].user<<" OFR "<<j<<" "<<p[j].time<<endl;
break;
}
if(sign==0)
for(int j=1;j<=N;j++)//最小过期
if(p[j].state==3)
{
IP[i]=j;
p[j].user=str1[i];
p[j].state=1;
sign=1;
if(ti[i]==0)//计算IP过期时间
p[j].time=T[i]+Tdef;
else
if( ti[i] > (T[i]+Tmax) )
p[j].time= (T[i]+Tmax) ;
else
if(ti[i]< (T[i]+Tmin) )
{
p[j].time=(T[i]+Tmin);
}
else
p[j].time=ti[i];
cout<<"dhcp "<<p[j].user<<" OFR "<<j<<" "<<p[j].time<<endl;
break;
}
}
else if(str3[i]=="REQ")//类型为REQ
{
if(str2[i]!="dhcp")
{
for(int j=1;j<=N;j++)
{
if(p[j].user==str1[i])
{
if(p[j].state==1)
{
p[j].user="";
p[j].state=0;
p[j].time=0;
}
}
}
continue;
}
else if((IP[i]<=N&&IP[i]>0)&&(p[IP[i]].user==str1[i]))
{
p[IP[i]].state=2;
if(ti[i]==0)//计算IP过期时间
p[IP[i]].time=T[i]+Tdef;
else
if( ti[i] > (T[i]+Tmax) )
p[IP[i]].time= (T[i]+Tmax) ;
else
if(ti[i]< (T[i]+Tmin) )
{
p[IP[i]].time=(T[i]+Tmin);
}
else
p[IP[i]].time=ti[i];
cout<<"dhcp "<<str1[i]<<" ACK "<<IP[i]<<" "<<p[IP[i]].time<<endl;
continue;
}
else
cout<<"dhcp "<<str1[i]<<" NAK "<<IP[i]<<" "<< 0 <<endl;
}
}
else if(str3[i]=="REQ")
{
if(str2[i]!="dhcp")
{
for(int j=1;j<=N;j++)
{
if(p[j].user==str1[i])
{
if(p[j].state==1)
{
p[j].user="";
p[j].state=0;
p[j].time=0;
}
}
}
continue;
}
}
}
return 0;
}
|