/* * IPAdress.h * * */ #define MAXADDRS 32 extern char *if_names[MAXADDRS]; extern char *ip_names[MAXADDRS]; extern char *hw_addrs[MAXADDRS]; extern unsigned long ip_addrs[MAXADDRS]; // Function prototypes void InitAddresses(); void FreeAddresses(); void GetIPAddresses(); void GetHWAddresses(); /* * IPAddress.c * */ // #include "IPAddress.h" #include <stdio.h> #include <stdlib.h> #include < string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/ in.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/sockio.h> #include <net/ if.h> #include <errno.h> #include <net/if_dl.h> #include <net/ethernet.h> // add include // #include "IPAddress.h" #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) #define BUFFERSIZE 4000 char *if_names[MAXADDRS]; char *ip_names[MAXADDRS]; char *hw_addrs[MAXADDRS]; unsigned long ip_addrs[MAXADDRS]; static int nextAddr = 0; void InitAddresses() { int i; for (i= 0; i<MAXADDRS; ++i) { if_names[i] = ip_names[i] = hw_addrs[i] = NULL; ip_addrs[i] = 0; } } void FreeAddresses() { int i; for (i= 0; i<MAXADDRS; ++i) { if (if_names[i] != 0) free(if_names[i]); if (ip_names[i] != 0) free(ip_names[i]); if (hw_addrs[i] != 0) free(hw_addrs[i]); ip_addrs[i] = 0; } InitAddresses(); } void GetIPAddresses() { int i, len, flags; char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr; struct ifconf ifc; struct ifreq *ifr, ifrcopy; struct sockaddr_in *sin; char temp[ 80]; int sockfd; for (i= 0; i<MAXADDRS; ++i) { if_names[i] = ip_names[i] = NULL; ip_addrs[i] = 0; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror( " socket failed "); return; } ifc.ifc_len = BUFFERSIZE; ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { perror( " ioctl error "); return; } lastname[ 0] = 0; for (ptr = buffer; ptr < buffer + ifc.ifc_len; ) { ifr = ( struct ifreq *)ptr; len = max( sizeof( struct sockaddr), ifr->ifr_addr.sa_len); ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer if (ifr->ifr_addr.sa_family != AF_INET) { continue; // ignore if not desired address family } if ((cptr = ( char *)strchr(ifr->ifr_name, ' : ')) != NULL) { *cptr = 0; // replace colon will null } if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) { continue; /* already processed this interface */ } memcpy(lastname, ifr->ifr_name, IFNAMSIZ); ifrcopy = *ifr; ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy); flags = ifrcopy.ifr_flags; if ((flags & IFF_UP) == 0) { continue; // ignore if interface not up } if_names[nextAddr] = ( char *)malloc(strlen(ifr->ifr_name)+ 1); if (if_names[nextAddr] == NULL) { return; } strcpy(if_names[nextAddr], ifr->ifr_name); sin = ( struct sockaddr_in *)&ifr->ifr_addr; strcpy(temp, inet_ntoa(sin->sin_addr)); ip_names[nextAddr] = ( char *)malloc(strlen(temp)+ 1); if (ip_names[nextAddr] == NULL) { return; } strcpy(ip_names[nextAddr], temp); ip_addrs[nextAddr] = sin->sin_addr.s_addr; ++nextAddr; } close(sockfd); } void GetHWAddresses() { struct ifconf ifc; struct ifreq *ifr; int i, sockfd; char buffer[BUFFERSIZE], *cp, *cplim; char temp[ 80]; for (i= 0; i<MAXADDRS; ++i) { hw_addrs[i] = NULL; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror( " socket failed "); return; } ifc.ifc_len = BUFFERSIZE; ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, ( char *)&ifc) < 0) { perror( " ioctl error "); close(sockfd); return; } ifr = ifc.ifc_req; cplim = buffer + ifc.ifc_len; for (cp=buffer; cp < cplim; ) { ifr = ( struct ifreq *)cp; if (ifr->ifr_addr.sa_family == AF_LINK) { struct sockaddr_dl *sdl = ( struct sockaddr_dl *)&ifr->ifr_addr; int a,b,c,d,e,f; int i; // strcpy(temp, (char *)ether_ntoa(LLADDR(sdl))); // modify strcpy(temp, ( char *)ether_ntoa(( struct ether_addr*)LLADDR(sdl))); sscanf(temp, " %x:%x:%x:%x:%x:%x ", &a, &b, &c, &d, &e, &f); sprintf(temp, " %02X:%02X:%02X:%02X:%02X:%02X ",a,b,c,d,e,f); for (i= 0; i<MAXADDRS; ++i) { if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0)) { if (hw_addrs[i] == NULL) { hw_addrs[i] = ( char *)malloc(strlen(temp)+ 1); strcpy(hw_addrs[i], temp); break; } } } } cp += sizeof(ifr->ifr_name) + max( sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); } close(sockfd); }
获取本机ip地址
发布日期:2021-09-08 22:54:42
浏览次数:18
分类:技术文章
本文共 4268 字,大约阅读时间需要 14 分钟。
转载于:https://www.cnblogs.com/hxwj/p/4864731.html
转载地址:https://blog.csdn.net/weixin_34341229/article/details/93340047 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月09日 13时15分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【力扣】82. 删除排序链表中的重复元素 II
2019-04-26
【剑指OFFER】 41. 数据流中的中位数
2019-04-26
【力扣】83. 删除排序链表中的重复元素
2019-04-26
【剑指OFFER】 43. 1~n 整数中 1 出现的次数
2019-04-26
【剑指OFFER】44. 数字序列中某一位的数字
2019-04-26
【剑指OFFER】45. 把数组排成最小的数
2019-04-26
【区块链】使用JAV简易A模拟创建区块链及挖矿
2019-04-26
【力扣】74. 搜索二维矩阵
2019-04-26
【剑指OFFER】46. 把数字翻译成字符串
2019-04-26
【剑指OFFER】47. 礼物的最大价值
2019-04-26
【力扣】90. 子集 II
2019-04-26
【剑指OFFER】48. 最长不含重复字符的子字符串
2019-04-26
【力扣】80. 删除有序数组中的重复项 II
2019-04-26
【剑指OFFER】50. 第一个只出现一次的字符
2019-04-26
【剑指OFFER】57 - II. 和为s的连续正数序列
2019-04-26
【Java】 用PriorityQueue实现最大最小堆
2019-04-26
【剑指OFFER】49. 丑数
2019-04-26
【力扣】179. 最大数
2019-04-26
【剑指OFFER】56 - I. 数组中数字出现的次数
2019-04-26
天池新人赛-工业蒸汽量预测-排名150
2019-04-26