简易DHCP服务器

题目描述

DHCP服务器的功能是为每一个MAC地址分配唯一的IP地址。现假设:分配的IP地址范围从 192.168.0.0 到 192.168.0.255 总共256个可用地址(以点分十进制表示)。请实现一个简易的DHCP服务器,功能如下:

  • 分配Request:根据输入的MAC地址分配IP地址池中的IP地址:
    • 如果对应的IP已分配并未释放,则为重复申请,直接返回对应已分配的IP地址。
    • 如果一个MAC地址已申请过并已释放,即:当前未分配IP地址,则为再申请,优先分配最近一次曾经为其分配过的IP地址,请返回此地址。
    • 按升序分配从未被分配过的IP地址;如果地址池中地址都已被分配过,则按升序分配已释放出来的IP地址;若可分配成功,则返回此IP地址。
    • 若仍然无法分配成功,则返回NA
  • 释放Release:根据输入的MAC地址释放已分配的IP地址:
    • 如果申请释放的对应的IP地址已分配,则释放此IP地址;
    • 如果申请释放的对应的IP地址不存在,则不作任何事情;

My Solution

    static class Mac{
        Integer ip;
        boolean state;    //true表示Mac已分配ip

        public Mac(Integer ip) {
            this.ip = ip;
            state = true;
        }

    }

    static class DhcpServer {
        HashMap<String,Mac> MacAddr;

        boolean ipAllocated[];  //boolean数组默认为false
        List<Integer> unallocated;

        DhcpServer() {
            MacAddr = new HashMap<>();
            unallocated = IntStream.rangeClosed(0,255).boxed().collect(Collectors.toList());
            ipAllocated = new boolean[256];
        }

        String allocate(String mac){
            if(unallocated.isEmpty()) return "NA";

            Integer i = unallocated.get(0);
            unallocated.remove(0);
            ipAllocated[i]=true;
            MacAddr.put(mac,new Mac(i));
            return "192.168.0."+String.valueOf(i);
        }


        String request(String mac) {
            if(!MacAddr.containsKey(mac)){  //是否为首次分配
                return allocate(mac);
            }
            else{ //不是第一次分配
                Mac mac1 = MacAddr.get(mac);
                if(!mac1.state){ //当前状态是未分配
                    //先尝试分配之前分配过的
                    if(ipAllocated[mac1.ip]) return allocate(mac);

                    ipAllocated[mac1.ip]=true;
                    unallocated.removeIf(s -> s.equals(mac1.ip));
                    mac1.state=true;
                }
                return "192.168.0."+String.valueOf(mac1.ip);
            }
        }

        void release(String mac) {
            if(!MacAddr.containsKey(mac))  return;
            Mac mac1 = MacAddr.get(mac);  //返回的是对其的引用
            if(mac1.state){
                mac1.state=false;
                unallocated.add(mac1.ip);
                ipAllocated[mac1.ip]=false;
            }
        }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值