简述
最近遇到一个dhcp相关的问题,就是我的设计模式有两种一种是自动获取ip服务,另一个种是手动配置ip服务;当我切换自动获取ip时会向服务器申请一个动态的ip,通常做法是使用命令在后台打开一个udhcpc客户端,然后通过客户端向服务器申请租约;当我切换手动配置ip时,通常是手动输入一个ip然后检测这个ip是否被占用,没有被占用则配置;
现在的想法是由于之前是自动获取ip的,后台有一个udhcpc客户端进程存在,而且路由器中的DHCP设备列表中也存在之前动态申请的ip地址;当我从自动获取ip切换到手动配置ip时,想要释放租约并且从路由器中的DHCP设备列表中移除已申请的ip地址,然后再关闭udhcpc客户端(为什么不是先关闭udhcpc客户端再解除租约,因为解除租约是依靠udhcpc客户端与路由器的服务端通信);
动态申请IP
首先使用udhcpc动态申请一个ip:
udhcpc -b -i eth0 -R
-q:表示得到组月后退出;
-b:表示在后台运行;
-i:如果存在多网卡时需要指定网卡名;
-R:表示udhcpc客户端程序退出后通知服务器释放租约;
释放租约
可能有人会疑惑使用kill、pkill或者killall杀死udhcpc客户端时不会通知服务器释放租约吗,明明申请ip的时候带了-R参数?正常情况下比如申请的时候带了-q参数,得到租约后自动退出前会通知服务器释放租约;但是使用kill、pkill或者killall杀死udhcpc客户端并不是正常的退出,而是强制关闭,所以不会通知服务器释放租约;
正确释放租约可以通过给udhcpc客户端进程发送一个USR2(开发板平台)或者SIGUSR2(linux平台)信号,然后再通过kill(通过pid关闭单个进程)或者killall(通过进程名称关闭这个名称下的所有进程):
// 开发板平台下:先通过USR2信号释放租约,然后再通过第二条命令关闭进程
kill -SR2 pid;kill pid
killall -SR2 udhcpc;killall udhcpc
// linux平台下:先通过SIGUSR2信号释放租约,然后再通过第二条命令关闭进程
kill -SIGUSR2 pid;kill pid
killall -SIGUSR2 udhcpc;killall udhcpc