文章目录
- DHCP协议
DHCP协议
stringstream的用法
应用实践
#include<bits/stdc++.h>using namespace std;signed main()
{string s="wo shi wwl, also wlw";stringstream ss;ss<<s;while(ss>>s){if(s[s.size()-1]==',') s[s.size()-1]=' ';cout<<s<<endl;}return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std;
const int MAXNAME=20;
int cnt=1;struct IP
{int id;int status;
}struct MESSAGE
{char send[MAXNAME];char rec[MAXNAME];char type[4];IP ip;int ddl;int start;
}mes[M];void predo()
{string s;getline(cin,s);stringstream ss;int start,ip,ddl;string send,rec,type;ss<<s;ss>>start,ss>>send,ss>>rec;ss>>type,ss>>ip,ss>>ddl;mes[cnt].start=start;mes[cnt].send=send;mes[cnt].rec=rec;mes[cnt].type=type;mes[cnt].ip=ip;mes[cnt].ddl=ddl;
}signed main()
{int N,Tdef,Tmax,Tmin;string H;cin>>N>>Tdef>>Tmax>>Tmin;cin>>H;int n;cin>>n;for(int i=1;i<=n;i++){predo();if(mes[cnt].send!=H&&mes[cnt].send!="*"){if(mes[cnt].type!="REQ") continue;}else if(mes[cnt].type!="REQ"||mes[cnt].type!="DIS"){continue;}else if(mes[cnt].send==H){if(mes[cnt].type=="DIS")continue;//在想一个怎么样能够很好判断是否占用的数据结构if(checkip(mes[cnt]))}else if(mes[cnt].send=="*"){if(mes[cnt].type!="DIS")continue;}cnt++;}return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std;
const int MAXNAME=20,MAXN=1e4+10;int N,Tdef,Tmax,Tmin;
string H;int start,ip,ddl;
string send,rec,type;int cnt=1;struct MESSAGE
{char send[MAXNAME];char rec[MAXNAME];char type[4];IP ip;int ddllow;int ddlup;int start;
}mes[M];bool ips[MAXN];bool checkmes(int ip)
{if(ips[ip]){return true;}else{int unsenip=0,minip=0;for(int i=1;i<=N;i++){//判断完是否有未分配最小或者过期最小后需要把那个最小的成员变量全部更新;//怎么去更新?//一个ip的截止时间能否在一开始就算出来if(unsenip==0&&ips[i].start==0){unsenip=i;}if(minip==0&&ips[i].time<cnt){minip=i;}}int resip=0;if(unsenip){resip=unsenip;}if(minip){resip=minip;}if(!resip){ips[resip]=1;//mes[++cnt].ip=resip;//ip是一个结构体if(!ddl){mes[cnt].ddl=cnt+Tdef;}else{}mes[cnt].send=send;mes[cnt].rec=H;mes[cnt].type=type;mes[cnt].start=start;mes[cnt].ddllow=start+Tmin;mes[cnt].ddlup=start+Tmax;return true;}}return false;
}signed main()
{cin>>N>>Tdef>>Tmax>>Tmin;cin>>H;int n;cin>>n;for(int i=1;i<=n;i++){string s;getline(cin,s);stringstream ss;ss<<s;ss>>start,ss>>send,ss>>rec;ss>>type,ss>>ip,ss>>ddl;if(send!=H&&send!="*"){if(type!="REQ") continue;}else if(type!="REQ"||type!="DIS"){continue;}else if(send==H){if(type=="DIS")continue;//在想一个怎么样能够很好判断是否占用的数据结构if(!checkmes()) continue;}else if(send=="*"){if(type!="DIS")continue;}cnt++;}return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std;
const int MAXNAME=20,MAXN=1e4+10;int N,Tdef,Tmax,Tmin;
string H;int start,ip,ddl;
string send,rec,type;int cnt=1;struct MESSAGE
{char send[MAXNAME];char rec[MAXNAME];char type[4];IP ip;int ddl;int start;
}mes[M];bool ips[MAXN];bool checkDISmes(int ip)
{if(ips[ip]){return true;}else{int unsenip=0,minip=0;for(int i=1;i<=N;i++){//判断完是否有未分配最小或者过期最小后需要把那个最小的成员变量全部更新;//怎么去更新?//一个ip的截止时间能否在一开始就算出来if(unsenip==0&&ips[i].start==0){unsenip=i;}if(minip==0&&ips[i].time<cnt){minip=i;}}int resip=0;if(unsenip){resip=unsenip;}if(minip){resip=minip;}if(!resip){ips[resip]=1;//mes[++cnt].ip=resip;//ip是一个结构体if(!ddl){mes[cnt].ddl=cnt+Tdef;}else{//如果请求的时间没有过长或者过短,都可以设置为读入的ddlif(cnt+Tmin<=ddl&&cnt+Tmax>=ddl){mes[cnt].ddl=ddl;}else{mes[cnt].ddl=0;}}//到此处处理完DIS报文再发送REQ报文的任务//对ip分成单独一个结构题的感觉愈加明显//mes应该不用分配结构体,只需要对其进行处理,然后分配ip//修改ip状态mes[cnt].send=send;mes[cnt].rec=H;mes[cnt].type=type;mes[cnt].start=start;return true;}}return false;
}signed main()
{cin>>N>>Tdef>>Tmax>>Tmin;cin>>H;int n;cin>>n;for(int i=1;i<=n;i++){string s;getline(cin,s);stringstream ss;ss<<s;ss>>start,ss>>send,ss>>rec;ss>>type,ss>>ip,ss>>ddl;if(send!=H&&send!="*"){if(type!="REQ") continue;}else if(type!="REQ"||type!="DIS"){continue;}else if(send==H){if(type=="DIS")continue;//在想一个怎么样能够很好判断是否占用的数据结构if(!checkDISmes()) continue;}else if(send=="*"){if(type!="DIS")continue;}cnt++;}return 0;
}
处理报文,分配IP,修改ip状态,那返回报文的部分需要怎么处理呢?
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std;
const int MAXNAME=20,MAXN=1e4+10;int N,Tdef,Tmax,Tmin;
string H;int start,ip,ddl;
string send,rec,type;int T;int cnt=1;struct MESSAGE
{char send[MAXNAME];char rec[MAXNAME];char type[4];IP ip;int ddl;int start;
}mes[M];vector<int> ips[MAXN];bool checkREQmes()
{if(rec!=H){}
}bool checkDISmes()
{if(ips[ip].size){return true;}else{int unsenip=0,minip=0;for(int i=1;i<=cnt;i++){//判断完是否有未分配最小或者过期最小后需要把那个最小的成员变量全部更新;//怎么去更新?//一个ip的截止时间能否在一开始就算出来if(unsenip==0&&mes[i].ddl==0){unsenip=i;}if(minip==0&&ips[i].time<cnt){minip=i;}}int resip=0;if(unsenip){resip=unsenip;}if(minip){resip=minip;}if(!resip){ips[resip]=1;//mes[++cnt].ip=resip;//ip是一个结构体if(!ddl){mes[cnt].ddl=cnt+Tdef;}else{//如果请求的时间没有过长或者过短,都可以设置为读入的ddlif(cnt+Tmin<=ddl&&cnt+Tmax>=ddl){mes[cnt].ddl=ddl;}else{mes[cnt].ddl=0;}}//到此处处理完DIS报文再发送REQ报文的任务//对ip分成单独一个结构题的感觉愈加明显//mes应该不用分配结构体,只需要对其进行处理,然后分配ip//修改ip状态mes[cnt].send=send;mes[cnt].rec=H;mes[cnt].type=type;mes[cnt].start=start;ips[ip]=1;//向发送主机发送报文的结果就是在控制台打印出东西//归根结底还是ip是否能分配成功printf("%s %s %s %d %d\n",H,send,"OFR",start,ddl);cnt++;return true;}}return false;
}signed main()
{cin>>N>>Tdef>>Tmax>>Tmin;cin>>H;int n;cin>>n;for(int i=1;i<=n;i++){string s;getline(cin,s);stringstream ss;ss<<s;ss>>start,ss>>send,ss>>rec;ss>>type,ss>>ip,ss>>ddl;if(send!=H&&send!="*"){if(type!="REQ") continue;}else if(type!="REQ"&&type!="DIS"){continue;}else if(send==H){if(type=="DIS")continue;//在想一个怎么样能够很好判断是否占用的数据结构}else if(send=="*"){if(type!="DIS")continue;}if(type=="DIS"){if(!checkDISmes()) continue;}if(type=="REQ"){if(!checkREQmes()) continue;}T++;}return 0;
}
最终ac版
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std;
const int MAXNAME=20,MAXN=1e4+10;int N,Tdef,Tmax,Tmin;
string H;int tc,ip,te;
string send,rec,type;int T;
int cnt=1;int m;struct IP
{int state; //0:为分配; 1:待分配; 2:占用; 3:过期 ;string user;int t;}ips[MAXN];/*
在到达该过期时刻时,若该地址的状态是待分配,
则该地址的状态会自动变为未分配,且占用者清空,
过期时刻清零;否则该地址的状态会由占用自动变为过期,
且过期时刻清零。处于未分配和过期状态的 IP 地址过期时刻为零,
即没有过期时刻。
*/void update()
{for(int i=1;i<=N;i++){if(ips[i].t&&ips[i].t<=tc){if(ips[i].state==1){ips[i].state=0;ips[i].user="";ips[i].t=0;}else{ips[i].state=3;ips[i].t=0;}}}
}//<发送主机> <接收主机> <报文类型> <IP 地址> <过期时刻>int get_ip_by_user(string s)
{for(int i=1;i<=N;i++){if(ips[i].user==s){return i;}}return 0;
}int get_ip_by_state(int state)
{for(int i=1;i<=N;i++){if(ips[i].state==state) return i;}return 0;
}void set1()
{for(int i=1;i<=N;i++){if(ips[i].user==send&&ips[i].state==1){ips[i].state=0;ips[i].user="";ips[i].t=0;}}
}signed main()
{cin>>N>>Tdef>>Tmax>>Tmin;cin>>H;cin>>m;while(m--){cin>>tc>>send>>rec>>type>>ip>>te;if(rec!=H&&rec!="*"){if(type!="REQ") continue;}if(type!="REQ"&&type!="DIS"){continue;}if((rec==H&&type=="DIS")||(rec=="*"&&type!="DIS")){continue;}//每读入一个报文,就有一个新的时刻,所以要更新//把过了时间的给去掉update();if(type=="DIS"){int k=get_ip_by_user(send);if(!k) k=get_ip_by_state(0);if(!k) k=get_ip_by_state(3);if(!k) continue;ips[k].state=1;ips[k].user=send;if(!te) ips[k].t=tc+Tdef;else{int delt=te-tc;delt=min(Tmax,delt);delt=max(Tmin,delt);ips[k].t=tc+delt;}cout<<H<<' '<<send<<' '<<"OFR"<<' '<<k<<' '<<ips[k].t<<endl;//printf("%s %s %s %d %d\n",send,rec,"OFR",k,ips[k].t);}else{//int k=get_ip_by_user(H);if(rec!=H){set1();continue;}if(!(ip>=1&&ip<=N&&ips[ip].user==send)){cout<<H<<' '<<send<<' '<<"NAK"<<' '<<ip<<' '<<0<<endl;//printf("%s %s %s %d %d\n",send,rec,"Nak",k,ips[k].t);//continue;}else{ips[ip].state=2;if(!te) ips[ip].t=tc+Tdef;else{int delt=te-tc;delt=min(Tmax,delt);delt=max(Tmin,delt);ips[ip].t=tc+delt;}cout<<H<<' '<<send<<' '<<"ACK"<<' '<<ip<<' '<<ips[ip].t<<endl;//printf("%s %s %s %d %d\n",send,rec,"Ack",k,ips[k].t);}}}return 0;
}