DHCP协议-CSP认证

2024-08-23 05:12
文章标签 csp 认证 协议 dhcp

本文主要是介绍DHCP协议-CSP认证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • DHCP协议

DHCP协议

stringstream的用法

image-20240822102304216

应用实践

#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;
}

这篇关于DHCP协议-CSP认证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098443

相关文章

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [