使用netlink方式,监听dhcp客户端的IP地址
来源:互联网 发布:智能锁屏软件 编辑:程序博客网 时间:2024/06/11 01:48
当机器联网后,会启动dhcpcd客户端程序获得ip,下面写一个netlink程序,监听
一下所获得的ip地址。代码很简陋,仅仅用于测试使用。
#define WM "eth0"static int recv_netlink_ip(int fd){static char buf[512];char *devname;struct iovec iov = {buf, sizeof(buf) };struct sockaddr_nl sa;struct msghdr msg = {(void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0};struct nlmsghdr *nlh;int len, index;struct ifinfomsg *ifi;struct ifinfomsg *pstruIF; struct nlmsgerr *pstruError;struct rtattr *pstruAttr;int nAttrLen;struct ifaddrmsg *ifa;struct rtattr *rth;int rtl;char name[IFNAMSIZ];uint32_t ipaddr;struct rtattr *rta;int ret = 0;int left;static char empty_ip[128];len = recvmsg(fd, &msg, 0);if (len <= (sizeof(struct nlmsghdr)+sizeof(struct ifinfomsg))) {printf("recvmsg(%d), len=%d\n", fd, len);goto out;}left = len;nlh = (struct nlmsghdr *)buf;while (NLMSG_OK(nlh, left)){switch(nlh->nlmsg_type){case RTM_NEWLINK:break;case RTM_DELLINK:break;case RTM_NEWADDR:ifa = (struct ifaddrmsg *) NLMSG_DATA (nlh);rth = IFA_RTA (ifa);rtl = IFA_PAYLOAD (nlh);for (;rtl && RTA_OK (rth, rtl); rth = RTA_NEXT (rth,rtl)){if (rth->rta_type != IFA_LOCAL) continue;ipaddr = * ((uint32_t *)RTA_DATA(rth));ipaddr = htonl(ipaddr);printf ("%s added %X\n",if_indextoname(ifa->ifa_index,name),ipaddr);printf("%s is now %d.%d.%d.%d\n",name,(ipaddr >> 24) & 0xff,(ipaddr >> 16) & 0xff,(ipaddr >> 8) & 0xff,ipaddr & 0xff);}if(strcmp(WM, if_indextoname(ifa->ifa_index,name)) == 0){}break; /* ip */case RTM_DELADDR:ifa = (struct ifaddrmsg *) NLMSG_DATA (nlh);rth = IFA_RTA (ifa);rtl = IFA_PAYLOAD (nlh);for (;rtl && RTA_OK (rth, rtl); rth = RTA_NEXT (rth,rtl)){if (rth->rta_type != IFA_LOCAL) continue;ipaddr = * ((uint32_t *)RTA_DATA(rth));ipaddr = htonl(ipaddr);printf ("%s added %X\n",if_indextoname(ifa->ifa_index,name),ipaddr);printf("%s is now %d.%d.%d.%d\n",name,(ipaddr >> 24) & 0xff,(ipaddr >> 16) & 0xff,(ipaddr >> 8) & 0xff,ipaddr & 0xff);}if(strcmp(WM, if_indextoname(ifa->ifa_index,name)) == 0){}break; /* del ip*/case RTM_GETADDR:break;case NLMSG_DONE:break;case NLMSG_ERROR:pstruError = (struct nlmsgerr *)NLMSG_DATA(nlh);printf("error : [%s]\n",strerror(-pstruError -> error));break;}nlh = NLMSG_NEXT(nlh, left);}out:return ret;}int check_ip(){int fd;struct sockaddr_nl sa;int ret;fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);if (fd < 0) {return -1;}memset(&sa, 0, sizeof(sa));sa.nl_family = AF_NETLINK;sa.nl_groups = RTMGRP_IPV4_IFADDR;if (bind(fd, (struct sockaddr *)&sa, sizeof(sa)) < 0){close(fd);return -1;}while (1){ret = recv_netlink_ip(fd);if (ret < 0){printf("recv ip break \n");break;}}return 0;}
- 使用netlink方式,监听dhcp客户端的IP地址
- DHCP服务器提供IP及客户端获取IP地址过程的诊断信息
- openwrt之dhcp客户端是如何设置端口ip地址的
- DHCP获取IP地址的过程
- DHCP的IP地址租约、释放
- DHCP的IP地址租约、释放
- Ubuntu的DHCP和静态IP地址
- OPENWRT 查看DHCP的IP地址
- 两种方式获取Thrift调用的客户端IP地址
- 通过js的方式获取客户端ip地址
- dhcp服务器的网卡有两个ip地址,属于一个网段,怎么只让他监听一个
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
- centos设置成自动获取ip地址方式(DHCP)
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
- VMware Fusion DHCP方式下如何指定虚拟机IP地址
- java获取客户端ip地址方式
- 无网络及使用DHCP分配IP地址系统的Oracle安装
- 使用DHCP,为开发板自动分配IP地址
- [转]keybd_event 被 SendInput 替代
- Unity 3D 获取手机SD卡目录列表
- How can I always run the command prompt as administrator?
- MC新手入门(四十六)------ 手势支持
- New Features in C++11 学习
- 使用netlink方式,监听dhcp客户端的IP地址
- 如何将Oracle 当前日期加一天、一分钟
- ucgui遮挡处理过程
- Uncaught TypeError: Object #<Object> has no method 'addEvents'
- phonegap源码分析(一)------ android
- Iframe高度自适应(兼容IE/Firefox、同域/跨域)
- Just Works的力量——Google科学家Jeff Dean斯坦福大学演讲的启示
- Delphi数据库编程新手指南(10)
- 在ClistCtrl里面得知滚动条是否到头