![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcucTM2EWN4MzNwIDMxIGZ2IDZwIDNzE2NkZjZiNWYzEmYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
<span style="font-family:Courier New;">
/********************************** (C) COPYRIGHT *******************************
* File Name : get_netinfo.c
* Author : skdkjzz
* Date : 2014/08/07
* Description : linux下擷取網卡資訊
*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#include <arpa/inet.h>
#include <linux/sockios.h>
int main(int argc,char*argv[]){
int s;
int err;
s=socket(AF_INET,SOCK_DGRAM,0);
if(s<0){
perror("socket error");
return;
}
struct ifreq ifr;
#if 1
memset(&ifr,0,sizeof(ifr));
ifr.ifr_ifindex=1; /* 獲得第1個網絡接口的名稱 */
err=ioctl(s,SIOCGIFNAME,&ifr);
if(err)
{
perror("index error");
}else
printf("----------------------------------\n");
printf("The %dst net device is : %s\n",ifr.ifr_ifindex,ifr.ifr_name);
err=ioctl(s,SIOCGIFHWADDR,&ifr); /* 獲得MAC位址 */
printf("%s:[%d] err is %d\n",__FUNCTION__,__LINE__,err);
if(!err)
unsigned char* hw=ifr.ifr_hwaddr.sa_data;
printf("Mac address is : %02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);
else
printf("Mac address is : 00:00:00:00:00:00\n");
struct sockaddr_in *sin=(struct sockaddr_in*)&ifr.ifr_addr; /* 擷取網絡接口IP儲存的是二進制IP */
char ip[16]; /* 字元數組,存放字元串 */
memset(ip,0,16);
err=ioctl(s,SIOCGIFADDR,&ifr);
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16); /* 轉換的字元串儲存到ip數組中,第二個參數是要轉換的二進制IP指針,第三個參數是轉換完成存放IP的緩沖區,最後一個參數是緩沖區的長度 */
printf("IP address is : %s\n",ip);
printf("IP address is : 0.0.0.0\n");
err=ioctl(s,SIOCGIFBRDADDR,&ifr); /* 得到接口的廣播位址 */
struct sockaddr_in *broadcast=(struct sockaddr_in*)&ifr.ifr_broadaddr;
inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16); /* 轉換成字元串,inet_ntop将二進制IP轉換成點分十進制的字元串 */
printf("BROADCAST IP is : %s\n",ip);
printf("BROADCAST IP is : 0.0.0.0\n",ip);
printf("----------------------------------\n");
#else
ifr.ifr_ifindex=2; /* 獲得第2個網絡接口的名稱 */
memcpy(ifr.ifr_name,argv[1],5);
if(err){
}else{
err=ioctl(s,SIOCGIFHWADDR,&ifr); /* 獲得MAC位址 */
if(!err){
sin=(struct sockaddr_in*)&ifr.ifr_addr;
inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);
err=ioctl(s,SIOCGIFBRDADDR,&ifr); /* 得到接口的廣播位址 */
inet_ntop(AF_INET,&broadcast->sin_addr.s_addr,ip,16);/* 轉換成字元串,inet_ntop将二進制IP轉換成點分十進制的字元串 */
#endif
close(s);
}
</span>