首页 > 编程知识 正文

dhcp服务器,漂亮的字体手写

时间:2023-05-04 22:51:20 阅读:176698 作者:2010

主题说明DHCP服务器的功能是为每个MAC地址分配一个唯一的IP地址。 现在,假设分配的IP地址范围为192.168.0.0到192.168.0.255,共有256个可用地址。 请实现简单的DHCP服务器。 功能如下。

分配Request:根据输入的MAC地址分配IP地址池中的IP地址:

1 .如果没有分配对应的IP地址,为了重复申请,直接返回对应的分配的IP地址。

2 .如果MAC地址已经申请并释放,即当前未分配IP地址,则优先分配最后分配的IP地址以进行重新申请。 请回到这个地址。

3 .按升序分配未分配的IP地址如果分配了地址池中的地址,请按升序分配释放的IP地址。 如果分配成功,则返回此IP地址。

4 .如果分配仍然不成功,则返回NA。

释放Release:根据输入的MAC地址释放已分配的IP地址:

1 .如果已经分配了申请释放的对应的IP地址,则释放此IP地址;

2 .如果释放申请的对应IP地址不存在,则不执行任何操作;

解答要求

时间限制: 1000ms,内存限制: 64MB

输入输出示例输入

第一个动作整数n表示接在其后输入的命令行数目、范围[ 1,2000 ]。

然后,每行都会分配一个命令。 格式为命令=MAC地址

命令只有REQUEST和RELEASE两种,分别表示分配和释放;

MAC地址是12个字符的大写英文字母或数字字符,例如AABBCCDDEEF1。

输出

1.REQUEST指令、输出分配结果(IP地址或NA )均为字符串形式。

注意: IP地址的每个部分都没有设置前0

2.RELEASE命令,不输出任何内容。

样例

输入示例1

2 request=aabbccdd ee f1 release=aabbccdd eef 1输出示例1192.168.0.0输入示例2

6 request=aabbccdd ee f1 request=F2 fbbcddeefrelease=aabbccdd ee f1 release=F2 fbbcddeeefrequest=F2 fbbc33333333333333 request=F2 F2 F2 F2 fbbbbbbbbbbbbbcdddddddddddddddderererese

提示:按升序分配未使用的IP,为192.168.0.0

REQUEST=AABBCCDDEEF1:按升序分配未使用的IP,为192.168.0.1

REQUEST=F2FBBCCDDEEF:版本IP 192.168.0.0。

RELEASE=AABBCCDDEEF1:版本IP 192.168.0.1。

RELEASE=F2FBBCCDDEEF:按升序分配未使用的IP,为192.168.0.2

REQUEST=333333333333:此MAC地址再申请为192.168.0.1,优先分配最近分配的IP

代码1(84% ) package com.atguigu.huawei; import Java.nio.charset.standard charsets; import java.util.*; publicclasshuaweitest { statichashmapstring,String curMacAddress=new HashMap (; //当前分配的static HashMapString,String oldMacAddress=new HashMap (; //已申请,staticliststringalladdress=new ArrayList (); //所有可用地址静态计数=0; //可用的地址计数器staticqueueintegerrealseaddress=newpriorityqueue (256,(i1,i2 )- i1 - i2 ); //释放的IP地址(此处使用最小堆),此处为序列号publicstaticvoidmain (string [ ] args ) scanner CIN=new scanner (system.in,standatic )

DhcpServer dhcpServer = new DhcpServer(); int operationCnt = cin.nextInt(); for (int i = 0; i < operationCnt; i++) { String[] operation = cin.next().split("="); if ("REQUEST".equals(operation[0])) { System.out.println(dhcpServer.request(operation[1])); } else { dhcpServer.release(operation[1]); } } cin.close(); } static class DhcpServer { DhcpServer() { // 生成所有的地址 for (int i = 0; i < 256; i++) { allAddress.add("192.168.0."+String.valueOf(i)); } } String request(String mac) { if(curMacAddress.containsKey(mac)){ //情况1(如果对应的IP已分配并未释放,则为重复申请,直接返回对应已分配的IP地址) return curMacAddress.get(mac); }else if(oldMacAddress.containsKey(mac)){ //情况2 优先分配最近一次曾经为其分配过的IP地址 return oldMacAddress.get(mac); }else if(count == 256){ //情况3 如果地址池中都已经被分配过,则按照升序分配已经释放出来的IP地址 int minAddress = realseAddress.poll(); String tempAddress = allAddress.get(minAddress); curMacAddress.put(mac,tempAddress); return tempAddress; }else if(count < 256){ //情况4 正常情况,按照升序分配 String minAddress = allAddress.get(count++); curMacAddress.put(mac,minAddress); return minAddress; }else { return "NA"; } } void release(String mac) { if(curMacAddress.containsKey(mac)){ //情况5 如果申请释放的对应的IP地址已经分配,则释放此IP地址 oldMacAddress.put(mac,curMacAddress.get(mac)); //使用过的进行添加 String tempAddress = curMacAddress.get(mac); String[] strings = tempAddress.split("\."); realseAddress.add(Integer.valueOf(strings[3])); //已经释放的IP进行添加(仅添加序号) curMacAddress.remove(mac); //进行移除 } } }} 代码2(92%) package com.atguigu.huawei;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class HuaWeiTest1 { static class DhcpServer { // IP地址前缀 private String IP_HEAD; // 用于记录某个MAC地址上一次分配的IP地址 private Map<String, Integer> map; // 记录已被分配过的IP地址状态 private boolean[] hasRelease; // 记录尚未分配的IP地址数量 private int addressCount; DhcpServer() { // 在此补充你的代码 // Init IP_HEAD = "192.168.0."; map = new HashMap<>(); hasRelease = new boolean[256]; addressCount = 0; } String request(String mac) { // 在此补充你的代码 // 检查mac的格式 if (mac.length() != 12 || !mac.matches("[a-zA-Z0-9]*")) { return "NA"; } int ipIndex; // IP已分配 if (map.containsKey(mac)) { int tempIp = map.get(mac); // 未释放或已释放 // 在再次分配已释放的地址时,会清理map缓存,此处无需对是否已释放进行判断 if (tempIp < addressCount) { ipIndex = tempIp; }else { ipIndex = Post(mac); } }else { ipIndex = Post(mac); } return ipIndex == -1 ? "NA" : IP_HEAD + ipIndex; } // 分配流程 int Post(String mac) { // 尚有未分配的ip地址,直接分配 if (addressCount != 256) { map.put(mac, addressCount); return addressCount++; } // 所有ip地址都已分配,遍历升序分配已释放的ip地址 for (int i = 0; i < 256; i++) { if (hasRelease[i]) { // 清除map中存储的与该ip地址的相关的缓存 Collection<Integer> cols = map.values(); cols.remove(i); // 修改状态数组 hasRelease[i] = false; // 写进缓存 map.put(mac, i); return i; } } // ip地址全部分配完毕,返回-1表示操作失败 return -1; } void release(String mac) { // 在此补充你的代码 // 如果缓存中有该mac地址,修改对应的ip地址为已释放 if (map.containsKey(mac)) { int ipIndex = map.get(mac); hasRelease[ipIndex] = true; } } }}

本公众号分享自己从程序员wjdjzg到经历春招秋招斩获10几个offer的面试笔试经验,其中包括【Java】、【操作系统】、【计算机网络】、【设计模式】、【数据结构与算法】、【大厂面经】、【数据库】期待你加入!!!

1.计算机网络----三次握手四次挥手
2.梦想成真-----项目自我介绍
3.你们要的设计模式来了
4.一字一句教你面试“个人简介”
5.接近30场面试分享

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。