题目描述
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;
}
}
}