码迷,mamicode.com
首页 > 编程语言 > 详细

[记]Linux 获取本机(全部)IP、MAC地址方法 (C/C++)

时间:2017-06-07 14:36:24      阅读:3088      评论:0      收藏:0      [点我收藏+]

标签:sizeof   struct   strlen   oid   strcpy   方法   stream   mil   std   

Linux 获取本机IP、MAC地址用法大全

 

 1   
 2 //#include <sys/types.h>
 3 #include <ifaddrs.h>
 4 #include <sys/ioctl.h> 
 5 #include <net/if.h> 
 6 #include <string.h> 
 7 #include <stdio.h>
 8 #include <unistd.h>
 9 #include <netdb.h>
10 //#include <sys/socket.h>
11 //#include <netinet/in.h>
12 #include <arpa/inet.h>
13 
14 char* getMac(char* mac,char* dv){
15     struct   ifreq   ifreq; 
16     int   sock; 
17     if(!mac || !dv)
18         return mac;
19     if((sock=socket(AF_INET,SOCK_STREAM,0)) <0) 
20     { 
21         perror( "socket "); 
22         return mac; 
23     } 
24     strcpy(ifreq.ifr_name,dv); 
25     if(ioctl(sock,SIOCGIFHWADDR,&ifreq) <0) 
26     { 
27         perror( "ioctl "); 
28         return mac; 
29     } close(sock);
30     sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x", 
31            (unsigned char)ifreq.ifr_hwaddr.sa_data[0], 
32            (unsigned char)ifreq.ifr_hwaddr.sa_data[1], 
33            (unsigned char)ifreq.ifr_hwaddr.sa_data[2], 
34            (unsigned char)ifreq.ifr_hwaddr.sa_data[3], 
35            (unsigned char)ifreq.ifr_hwaddr.sa_data[4], 
36            (unsigned char)ifreq.ifr_hwaddr.sa_data[5]);
37     return mac;
38 }
39 
40 int main (int argc, const char * argv[])
41 {
42     char hname[128];
43     struct hostent *hent;
44     int i;
45 
46     gethostname(hname, sizeof(hname));
47 
48     //hent = gethostent();
49     hent = gethostbyname(hname);
50 
51     printf("hostname: %s\n", hent->h_name);
52   
53 //----------------------------------------------------------
54     printf("\n\n\n");
55 
56     char mac[30];
57     struct ifaddrs * ifAddrStruct=NULL;
58     void * tmpAddrPtr=NULL;
59 
60     getifaddrs(&ifAddrStruct);
61 
62     while (ifAddrStruct!=NULL) {
63         if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
64             // is a valid IP4 Address
65             tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
66             char addressBuffer[INET_ADDRSTRLEN];
67             inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
68             printf("%s IP: %s\n", ifAddrStruct->ifa_name, addressBuffer);
69             printf("MAC: %s\n\n",getMac(mac,ifAddrStruct->ifa_name));
70         } else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) { // check it is IP6
71             // is a valid IP6 Address
72             tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
73             char addressBuffer[INET6_ADDRSTRLEN];
74             inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
75             printf("%s IP: %s\n", ifAddrStruct->ifa_name, addressBuffer); 
76             printf("MAC: %s\n\n",getMac(mac,ifAddrStruct->ifa_name));
77         } 
78         ifAddrStruct=ifAddrStruct->ifa_next;
79     }
80     return 0;
81 
82 } 

 

再次做个笔记

(更多参考:Linux 获取本机IP、MAC地址用法大全)

 

[记]Linux 获取本机(全部)IP、MAC地址方法 (C/C++)

标签:sizeof   struct   strlen   oid   strcpy   方法   stream   mil   std   

原文地址:http://www.cnblogs.com/lzpong/p/6956439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!