CSP-DHCP服务器60分代码

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>

#include<string>

#include<algorithm>

#include<cstring>

#include<unordered_map>

#include<vector>

using namespace std;

struct Paper {

string send, receive, lei;

int ip, nowt, datet;

};

struct IP {

int state, datet;//0,1,2,3分别表示未分配、待分配、占用、过期四种状态。

string zhan;

};

unordered_map<int, IP> iplist;

unordered_map<string, int> zhanlist;

int N, Tdef, Tmax, Tmin,n;

string host;

void init(void)

{

for (int i = 1; i <= N; i++)

{

IP tmp;

tmp.state = 0, tmp.datet = 0;

iplist.insert({ i,tmp });

}

}

Paper inputpaper(void)

{

Paper tmp;

cin >> tmp.nowt;

cin >> tmp.send >> tmp.receive >> tmp.lei >> tmp.ip >> tmp.datet;

return tmp;

}

void outputpaper(Paper& a)

{

cout << a.send << " " << a.receive << " " << a.lei << " " << a.ip << " "

<< a.datet << endl;

}

bool check_paper(Paper& a)

{

if (a.receive != "*" && a.receive != host)

if (a.lei != "REQ")

return false;

if (a.lei != "REQ" && a.lei != "DIS")

return false;

if ((a.receive == "*" && a.lei != "DIS") || (a.receive == host && a.lei == "DIS"))

return false;

return true;

}

int select_ip(string send,int nowt)

{

if (zhanlist.count(send) != 0 && iplist[zhanlist[send]].zhan == send)

return zhanlist[send];

int weifenpei = 0, guoqi = 0;

for (int i = 1; i <= N; i++)

{

if (iplist[i].state == 1 && iplist[i].datet <= nowt)

{

iplist[i].state = iplist[i].datet = 0;

zhanlist.erase(iplist[i].zhan);

}

if (iplist[i].state == 2 && iplist[i].datet <= nowt)

{

iplist[i].state = 3;

iplist[i].datet = 0;

}

if (iplist[i].state == 0)

{

weifenpei = i;

break;

}

if (iplist[i].state == 3 && guoqi == 0)

guoqi = i;

}

if (weifenpei)

return weifenpei;

if (guoqi)

return guoqi;

return 0;

}

void process_DIS(Paper a)

{

Paper res;

int ip = select_ip(a.send,a.nowt);

if (!ip)

return;

//这里有可能出错,就是map能不能直接等

iplist[ip].state = 1;

iplist[ip].zhan = a.send;

zhanlist[a.send] = ip;

//

if (a.datet == 0)

res.datet = a.nowt + Tdef;

else

{

if (a.datet - a.nowt > Tmax)

res.datet = a.nowt + Tmax;

else if (a.datet - a.nowt < Tmin)

res.datet = a.nowt + Tmin;

else

res.datet = a.datet;

}

//

iplist[ip].datet = res.datet;

res.send = host, res.receive = a.send, res.lei = "OFR", res.ip = ip;

outputpaper(res);

}

void process_REQ(Paper a)

{

Paper res;

//

if (a.receive != host)

{

if (zhanlist.count(a.send) != 0)

{

int ip = zhanlist[a.send];

iplist[ip].state = 0;

iplist[ip].datet = 0;

zhanlist.erase(a.send);

}

return;

}

//

if (a.ip >= 1 && a.ip <= N && iplist[a.ip].zhan == a.send)

;

else

{

res.send = host, res.receive = a.send, res.lei = "NAK", res.ip = a.ip;

res.datet = 0;

outputpaper(res);

return;

}

//

iplist[a.ip].state = 2;

//

if (a.datet == 0)

res.datet = a.nowt + Tdef;

else

{

if (a.datet - a.nowt > Tmax)

res.datet = a.nowt + Tmax;

else if (a.datet - a.nowt < Tmin)

res.datet = a.nowt + Tmin;

else

res.datet = a.datet;

}

//

iplist[a.ip].datet = res.datet;

res.send = host, res.receive = a.send, res.lei = "ACK", res.ip = a.ip;

outputpaper(res);

}

int main(void)

{

cin >> N >> Tdef >> Tmax >> Tmin >> host >> n;

while (n--)

{

Paper a;

a = inputpaper();

if (!check_paper(a))

continue;

if (a.lei == "DIS")

process_DIS(a);

else

process_REQ(a);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值