0
点赞
收藏
分享

微信扫一扫

CCFDHCP服务器

_阿瑶 2022-02-26 阅读 11

在这里插入图片描述

#include <iostream>
#include <map>
using namespace std;
//state 0:未分配 1:待分配 2:占用 4:过期
struct ips{
    int ip,time,state;
    string zy;
    void creatip(int i){ip=i;state=0;time=0;}
};
int main()
{
    int N,td,tmax,tmin;
    string h;

    scanf("%d%d%d%d",&N,&td,&tmax,&tmin);
    cin>>h;

    ips ip[N+1];
    for(int i=1;i<=N;i++){
        ip[i].creatip(i);
    }
    int cs;
    scanf("%d",&cs);
    map<string,int> mp;

    int ti,ipv,timev;
    string fhost,jhost,type;
    for(int i=0;i<cs;i++){
        cin>>ti>>fhost>>jhost>>type>>ipv>>timev;
        mp[fhost]=0;
        if(jhost!=h&&jhost!="*"){
            if(type!="REQ")continue;
        }
        if(type!="DIS"&&type!="REQ")continue;
        if(jhost=="*"&&type!="DIS")continue;
        if(jhost==h&&type=="DIS")continue;

        for(int j=1;j<=N;j++){
                if(ip[j].state==1&&ti>=ip[j].time){
                    ip[j].state=0; ip[j].zy=""; ip[j].time=0;
                }
                if(ip[j].state==2&&ti>=ip[j].time){
                    ip[j].state=3; ip[j].time=0;
                }
        }
        if(type=="DIS"){
            int getip=0;
            for(int k=1;k<=N;k++){
                if(ip[k].zy==fhost){
                    getip=ip[k].ip;
                    break;
                }
            }
            if(getip==0){
                for(int k=1;k<=N;k++){
                if(ip[k].state==0){
                    getip=ip[k].ip;
                    break;
                }
                }
            }
            if(getip==0){
                for(int k=1;k<=N;k++){
                if(ip[k].state==3){
                    getip=ip[k].ip;
                    break;
                }
                }
            }
            if(getip!=0){
                ip[getip].state=1;
                ip[getip].zy=fhost;
                if(timev==0){
                    ip[getip].time=ti+td;
                }
                else if(timev>tmax+ti)ip[getip].time=tmax+ti;
                else if(timev<tmin+ti)ip[getip].time=tmin+ti;
                else ip[getip].time=timev;
                cout<<h<<" "<<fhost<<" OFR "<<getip<<" "<<ip[getip].time<<endl;

            }

        }

        if(type=="REQ"){

            if(jhost!=h){
                for(int k=1;k<=N;k++){
                if(ip[k].zy==fhost&&ip[k].state==1){
                    ip[k].state=0;
                    ip[k].zy="";
                    ip[k].time=0;

                }
                }
            }
            else{
                if(ipv<=N&&ip[ipv].zy==fhost){
                ip[ipv].state=2;
                if(timev==0){
                    ip[ipv].time=ti+td;
                }
                else if(timev>tmax+ti)ip[ipv].time=tmax+ti;
                else if(timev<tmin+ti)ip[ipv].time=tmin+ti;
                else ip[ipv].time=timev;
                cout<<h<<" "<<fhost<<" ACK "<<ipv<<" "<<ip[ipv].time<<endl;
            }
            else{
                cout<<h<<" "<<fhost<<" NAK "<<ipv<<" "<<0<<endl;
            }
            }


        }
    }


    return 0;
}

举报

相关推荐

0 条评论