重点内容
函数 : ioctl(int fd, int request, void * arg)
1 #include<stdio.h>
2 #include <sys/socket.h>
3 #include <arpa/inet.h>
4 #include <string.h>
5 #include <sys/ioctl.h>
6 #include <net/if.h>
7
8 int main(int argc,char**argv)
9 { int i;
10 char mac[32];
11 int sock;
12 int res;
13 struct ifreq ifr;
14 struct sockaddr_in *addr;
15 char *address;
16/*struct ifreq 就是用来存储返回的接口相关信息的结构体,由于电脑可能有多个硬件接口,因此我们使用指针来存储返回的结构体数组。struct sockaddr_in变量是用来存储ioctl()函数返回结果,也就是mac地址,ip地址,子网掩码的相关信息。*/
17 sock = socket(AF_INET, SOCK_STREAM, 0); /*流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用*/
18 strcpy(ifr.ifr_name, "eth3");
19 res = ioctl(sock, SIOCGIFADDR, &ifr); /*获取网络接口地址ip*/
20 addr=(struct sockaddr_in*)&(ifr.ifr_addr);
21 address=inet_ntoa(addr->sin_addr);
22
23 printf("IP: %s\n",address);/*inet_ntoa()的作用是ip地址格式转换,转换为计算机识别的二进制格式*/
24 /* get ip address*/
25
26
27 res =ioctl(sock,SIOCGIFHWADDR,&ifr);/*获取MAC地址*/
28 for(i = 0; i < 6; ++i)
29 {
30 sprintf(mac + 3*i, "%02x:", (unsigned char)ifr.ifr_hwaddr.sa_data[i]);
31 }
32 printf("MAC: %s\n",mac);
33
34
35 res =ioctl(sock,SIOCGIFNETMASK,&ifr);/*获取子网掩码*/
36 addr = (struct sockaddr_in *)&(ifr.ifr_addr);
37 address = inet_ntoa(addr->sin_addr);
38
39 printf("Mask: %s\n",address);
40
41 return 0;
42
43
44 }
测试结果:
strcpy和memcpy的区别:
http://www.codeweblog.com/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3strcpy%E4%B8%8Ememcpy%E7%9A%84%E5%8C%BA%E5%88%AB/