简易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
    评论
DHCP(动态主机配置协议)是一种计算机网络协议,它允许在网络上的计算机自动获得IP地址和其他网络参数,而无需手动配置。DHCP服务器是负责分配IP地址和其他网络参数的服务程序。以下是DHCP服务器在Linux中的配置步骤: 1. 安装DHCP服务器软件:在Linux系统中,DHCP服务器软件通常是dhcpd包。使用命令行终端运行以下命令安装软件: ``` sudo apt-get install isc-dhcp-server ``` 2. 配置DHCP服务器:编辑/etc/dhcp/dhcpd.conf文件。该文件包含DHCP服务器的所有配置信息。在此文件中,您需要指定DHCP服务器要分配的IP地址范围,子网掩码和默认网关等参数。例如,以下是一个简单的配置示例: ``` subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option routers 192.168.1.1; option domain-name-servers 8.8.8.8; } ``` 这个示例配置了一个子网,其中IP地址范围是从192.168.1.100到192.168.1.200,子网掩码为255.255.255.0。默认网关是192.168.1.1,DNS服务器为8.8.8.8。 3. 配置DHCP服务器接口:打开/etc/default/isc-dhcp-server文件,将DHCP服务器要使用的接口名称添加到INTERFACES变量中。例如: ``` INTERFACES="eth0" ``` 这个示例将DHCP服务器配置在eth0接口上。 4. 启动DHCP服务器:运行以下命令启动DHCP服务器: ``` sudo service isc-dhcp-server start ``` 现在,DHCP服务器已经配置完毕并启动。它将为连接到指定接口的设备分配IP地址和其他网络参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值