DHCP协议-CSP认证

news2025/1/11 12:36:32

文章目录

    • 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
      {
        //如果请求的时间没有过长或者过短,都可以设置为读入的ddl
       	if(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
      {
        //如果请求的时间没有过长或者过短,都可以设置为读入的ddl
       	if(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

128-域横向移动IPCATSC命令Impacket套件CS插件全自动

因为只有一台云服务器而且开不起台多的虚拟机只能只用几台进行演示&#x1f62d;&#x1f62d;&#x1f62d; 小迪的环境 上线之后先做的事情&#xff1a; IPC方式进行横向移动 at schtasks 他这里第三条命令有问题换成这个可以执行 schtasks /create /s 172.16.3.128 /U a…

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别

目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中&#xff0c;经常会见到各种各样的证书相关类型的文件&#xff0c;错综复杂。 其实 keystore、jks、p12、p…

濮阳示范区党工委书记杨行玉一行莅临超维机器人参观考察

8月20日&#xff0c;濮阳示范区党工委书记杨行玉带队赴郑州开展招商活动&#xff0c;并莅临超维机器人参观考察。此次考察旨在加快濮阳示范区产业升级步伐&#xff0c;推动高科技项目引进和落地&#xff0c;为区域经济高质量发展注入新动能。区三级调研员张立春、区招商局负责人…

外挂系统 -减少SAP用户许可数, 多点操作及时同步SAP

用过SAP 的人都知道SAP 是按照用户数来计算项目费用和年维护费的,所以很多公司设置了共同账号,外挂程序,WDA程序等,各种各样的规避方式。 当然SAP 标准的功能也相对简单化,要实现一些自定义的功能来满足各企业实际业务,那需要进行二次开发,有些顾问公司则通过在SAP 中开…

云计算实训33——高并发负载均衡项目(eleme)

一、配置一主两从mysql服务器&#xff08;mysql5.7&#xff09; 1.主服务器master 下载mysql5.7的包 [rootMysql ~]# rz -E rz waiting to receive. [rootMysql ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz #解压 [rootMysql ~]# tar -zxf mysql-5…

用TensorFlow实现线性回归

说明 本文采用TensorFlow框架进行讲解&#xff0c;虽然之前的文章都采用mxnet&#xff0c;但是我发现tensorflow提供了免费的gpu可供使用&#xff0c;所以果断开始改为tensorflow&#xff0c;若要实现文章代码&#xff0c;可以使用colaboratory进行运行&#xff0c;当然&#…

ZooKeeper入门及核心知识点整理

什么是Zookeeper Zookeeper简称zk&#xff0c;先从字面意思上去理解&#xff0c;那就是动物园管理员。其实zk是大数据领域中的一员&#xff0c;为整个分布式环境提供了协调服务&#xff0c;主要可以用于存储一些配置信息&#xff0c;同时也可以基于zk实现集群。它是一个apache…

RabbitMQ的基础概念介绍

MQ的三大特点&#xff1a;削峰、异步、解耦 1.RabblitMQ概念介绍 1.1概念 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息…

【docker】使用docker-compose的时候如何更新镜像版本

使用docker-compose的时候如何更新镜像版本。之前总是会忘记怎么操作&#xff0c;每次都得百度搜&#xff0c;干脆记录一下。 说明 我有一个memos是用docker-compose部署的&#xff0c;memos更新的挺频繁的&#xff0c;新版本的功能也不错&#xff0c;更新一下没啥问题。 注…

吴恩达机器学习课后作业-03多分类、神经网络前向传播

这里写目录标题 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。&#xff09;绘制图像结果 神经网络前向传播数字识别 、 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。…

[Algorithm][综合训练][孩子们的游戏][大数加法][拼三角]详细讲解

目录 1.孩子们的游戏1.题目链接2.算法原理详解 && 代码实现 2.大数加法1.题目链接2.算法原理详解 && 代码实现 3.拼三角1.题目链接2.算法原理详解 && 代码实现 1.孩子们的游戏 1.题目链接 孩子们的游戏 2.算法原理详解 && 代码实现 问题抽象…

LongWriter——从长文本语言模型中释放出10,000+字的生成能力

概述 当前的长上下文大型语言模型 (LLM) 可以处理多达 100,000 个词的输入&#xff0c;但它们很难生成超过 2,000 个词的输出。受控实验表明&#xff0c;该模型的有效生成长度本质上受到监督微调(SFT) 期间看到的示例的限制。换句话说&#xff0c;这种输出限制源于现有 SFT 数…

三维模型单体化软件:地理信息与遥感领域的精细化革命

在地理信息与遥感科学日新月异的发展浪潮中&#xff0c;单体化软件作为一股强大的驱动力&#xff0c;正引领着我们迈向空间信息处理与应用的新纪元。本文旨在深度解析单体化软件的核心价值、技术前沿、实践应用及面临的挑战&#xff0c;共同探讨这一技术如何塑造行业的未来。 …

【手撕OJ题】——BM8 链表中倒数最后k个结点

目录 &#x1f552; 题目⌛ 方法① - 直接遍历⌛ 方法② - 快慢指针 &#x1f552; 题目 &#x1f50e; BM8 链表中倒数最后k个结点【难度&#xff1a;简单&#x1f7e2;】 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 a i a_i ai​ &#xff0c;返回该链表中倒…

一款MySQL数据库实时增量同步工具,能够监听MySQL二进制日志(Binlog)的变动(附源码)

背景 作为一名CURD的程序员&#xff0c;少不了跟MySQL打交道&#xff0c;在同步数据的时候&#xff0c;MySQL的Binlog显得重中之重&#xff0c;所以处理Binlog的工具尤为重要。 其中阿里巴巴开源的canal 更是耳闻目睹&#xff0c;但是今天小编给大家介绍另外一款MySQL数据库实…

【C++11】常用新语法②(类的新功能 || 可变参数模板 || lambda表达式 || 包装器)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C 目录 &#x1f308;前言&#x1f525;类的新功能新增默认成员函数强制生成默认函数的关键字default禁止生成默认函数的关键字delete &#x1f525;可变参数模板递归函数方式展开参数包…

论文翻译:Benchmarking Large Language Models in Retrieval-Augmented Generation

https://ojs.aaai.org/index.php/AAAI/article/view/29728 检索增强型生成中的大型语言模型基准测试 文章目录 检索增强型生成中的大型语言模型基准测试摘要1 引言2 相关工作3 检索增强型生成基准RAG所需能力数据构建评估指标 4实验设置噪声鲁棒性结果负面拒绝测试平台结果信息…

算法5:位运算

文章目录 小试牛刀进入正题 没写代码的题&#xff0c;其链接点开都是有代码的。开始前请思考下图&#xff1a; 小试牛刀 位1的个数 class Solution { public:int hammingWeight(int n) {int res 0;while (n) {n & n - 1;res;}return res;} };比特位计数 class Solution…

计算机毕业设计选题推荐-猫眼电影数据可视化分析-Python爬虫-k-means算法

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

进程和文件痕迹排查——LINUX

目录 介绍步骤 介绍 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。 在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&…