获取网卡信息

目录

示例

自动获取网络接口信息程序


 

 

示例

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <net/if.h> 
#include <unistd.h>  
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h>

//获取本机IP地址函数
char* GetLocalIp()
{  
  
    int sock_get_ip;
    char ipaddr[50];
  
    struct   sockaddr_in *sin;
    struct   ifreq ifr_ip;
  
    if ((sock_get_ip=socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {  
         printf("socket create failse...GetLocalIp!\n");
         return "";  
    }  
     
    memset(&ifr_ip, 0, sizeof(ifr_ip));
    strncpy(ifr_ip.ifr_name, "eth0", sizeof(ifr_ip.ifr_name) - 1);
   
    if( ioctl( sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0 )
    {     
         return "";
    }       
    sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;
    strcpy(ipaddr,inet_ntoa(sin->sin_addr));  
      
    printf("local ip:%s \n",ipaddr);
    close(sock_get_ip);
      
    return ipaddr;
}



//修改本机IP地址的函数2
//使用root权限
int SetLocalIp(const char *ipaddr)  
{  
    int sock_set_ip;  
      
    struct sockaddr_in sin_set_ip;  
    struct ifreq ifr_set_ip;  
  
    bzero( &ifr_set_ip,sizeof(ifr_set_ip));  
   
    if(ipaddr == NULL)  
        return -1;  
  
	if ((sock_set_ip = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {  
         printf("socket create failse...GetLocalIp!\n");
         return "";  
    }  
 
    memset( &sin_set_ip, 0, sizeof(sin_set_ip));  
    strncpy(ifr_set_ip.ifr_name, "eth0", sizeof(ifr_set_ip.ifr_name)-1);     
      
    sin_set_ip.sin_family = AF_INET;  
    sin_set_ip.sin_addr.s_addr = inet_addr(ipaddr);  
    memcpy( &ifr_set_ip.ifr_addr, &sin_set_ip, sizeof(sin_set_ip));  
  
    if(ioctl(sock_set_ip, SIOCSIFADDR, &ifr_set_ip) < 0 )  
    {  
        printf( "Not setup interface\n");  
        return -1;  
    }  
  
    //设置激活标志  
    ifr_set_ip.ifr_flags |= IFF_UP |IFF_RUNNING;  
  
    //get the status of the device  
    if(ioctl( sock_set_ip, SIOCSIFFLAGS, &ifr_set_ip ) < 0 )  
    {  
         printf("SIOCSIFFLAGS\n");  
         return -1;  
    }  
 
    close(sock_set_ip);

    return 0;
}

//获取本机MAC地址的函数
char* GetLocalMac()  
{  
    int sock_mac;  
      
    struct ifreq ifr_mac;  
    char mac_addr[30];     
      
    sock_mac = socket( AF_INET, SOCK_STREAM, 0 );  
    if( sock_mac == -1)  
    {  
        perror("create socket falise...mac/n");  
        return "";  
    }  
      
    memset(&ifr_mac,0,sizeof(ifr_mac));     
    strncpy(ifr_mac.ifr_name, "eth0", sizeof(ifr_mac.ifr_name)-1);     
  
    if( (ioctl( sock_mac, SIOCGIFHWADDR, &ifr_mac)) < 0)  
    {  
        printf("mac ioctl error/n");  
        return "";  
    }  
      
    sprintf(mac_addr,"%02x%02x%02x%02x%02x%02x",  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[0],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[1],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[2],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[3],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[4],  
            (unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]);  
  
    printf("local mac:%s \n",mac_addr);      
      
    close( sock_mac );  
    return mac_addr;  
}

//获取子网掩码的函数
char* GetLocalNetMask()  
{  
    int sock_netmask;  
    char netmask_addr[50];  
  
    struct ifreq ifr_mask;  
    struct sockaddr_in *net_mask;  
          
    sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );  
    if( sock_netmask == -1)  
    {  
        perror("create socket failture...GetLocalNetMask\n");  
        return "";  
    }  
      
    memset(&ifr_mask, 0, sizeof(ifr_mask));     
    strncpy(ifr_mask.ifr_name, "eth0", sizeof(ifr_mask.ifr_name )-1);     
  
    if( (ioctl( sock_netmask, SIOCGIFNETMASK, &ifr_mask ) ) < 0 )   
    {  
        printf("mac ioctl error\n");  
        return "";  
    }  
      
    net_mask = ( struct sockaddr_in * )&( ifr_mask.ifr_netmask );  
    strcpy( netmask_addr, inet_ntoa( net_mask -> sin_addr ) );  
      
    printf("local netmask:%s\n",netmask_addr);      
      
    close( sock_netmask );  
    return netmask_addr;  
}

//获取IP
int GetIP()
{
    struct ifaddrs * ifAddrStruct=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&ifAddrStruct);

    while (ifAddrStruct!=NULL) {
        if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifAddrStruct->ifa_name, addressBuffer); 
        } else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) { // check it is IP6
            // is a valid IP6 Address
            tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifAddrStruct->ifa_name, addressBuffer); 
        } 
        ifAddrStruct=ifAddrStruct->ifa_next;
    }
    return 0;
}


int main(int argc, char** argv)
{
	char* LocalIp = NULL;
	const char* SetLocalIP = "192.168.0.121";
	int ret = -1;
	char* LocalMac = NULL;
	char* LocalNetMask = NULL;

	//LocalIp = GetLocalIp();

	//printf("LocalIp:%s\n", LocalIp);

	//ret = SetLocalIp(SetLocalIP);
	//printf("ret = %d\n", ret);

	//LocalMac = GetLocalMac();
	//printf("LocalMac:%s\n", LocalMac);

	//LocalNetMask = GetLocalNetMask();
	//printf("LocalNetMask:%s\n", LocalNetMask);

	GetIP();

	return 0;

}

 

 

自动获取网络接口信息程序

用于网络编程时,获取本机的网络接口的信息,包括:接口总数量及每个接口的名字、IP地址、MAC地址、子网掩码、广播地址、的状态。

运行该程序时需要root权限。

#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/ether.h> 
 
#define MAXINTERFACES 16        // 最大接口数 
 
typedef struct interface{
 char name[20];          //接口名字
 unsigned char ip[4];  //IP地址
 unsigned char mac[6];  //MAC地址
 unsigned char netmask[4]; //子网掩码
 unsigned char br_ip[4];  //广播地址
 int  flag;           //状态
}INTERFACE;
 
int interface_num=0;                    //接口数量
INTERFACE net_interface[MAXINTERFACES]; //接口数据
 
int main(int argc,char *argv[])
{
 struct ifreq buf[MAXINTERFACES];    // ifreq结构数组 
 struct ifconf ifc;                  // ifconf结构 
 int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));//创建套接字
 
  /* 初始化ifconf结构 */
    ifc.ifc_len = sizeof(buf);
    ifc.ifc_buf = (caddr_t) buf;
 
    /* 获得接口列表 */
    if (ioctl(sock_raw_fd, SIOCGIFCONF, (char *) &ifc) == -1)
 {
        perror("SIOCGIFCONF ioctl");
        return ;
    }
    interface_num = ifc.ifc_len / sizeof(struct ifreq); // 接口数量
 printf("num=%d\n",interface_num);                   //打印接口数量
  char buff[20]="";
 int ip;
 int if_len = interface_num;
    while (if_len-- > 0)   // 遍历每个接口 
 {  
        sprintf(net_interface[if_len].name, "%s", buf[if_len].ifr_name); // 接口名称
        /* 获得接口标志 */
        if (!(ioctl(sock_raw_fd, SIOCGIFFLAGS, (char *) &buf[if_len])))
  {
            /* 获取接口状态 */
            if (buf[if_len].ifr_flags & IFF_UP)
   {
    net_interface[if_len].flag = 1;
            }
            else
   {
    net_interface[if_len].flag = 0;
            }
        }
  else
  {
            char str[256];
            sprintf(str, "SIOCGIFFLAGS ioctl %s", buf[if_len].ifr_name);
            perror(str);
        }
 
        /* 获取IP地址 */
        if (!(ioctl(sock_raw_fd, SIOCGIFADDR, (char *) &buf[if_len])))
  {
   bzero(buff,sizeof(buff));
   sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
   inet_pton(AF_INET, buff, &ip);
   memcpy(net_interface[if_len].ip, &ip, 4);
  }
  else
  {
            char str[256];
            sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
            perror(str);
        }
 
        /* 获取子网掩码 */
        if (!(ioctl(sock_raw_fd, SIOCGIFNETMASK, (char *) &buf[if_len])))
  {
   bzero(buff,sizeof(buff));
   sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
   inet_pton(AF_INET, buff, &ip);
   memcpy(net_interface[if_len].netmask, &ip, 4);
        }
  else
  {
            char str[256];
            sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
            perror(str);
        }
 
        /* 获取广播地址 */
        if (!(ioctl(sock_raw_fd, SIOCGIFBRDADDR, (char *) &buf[if_len])))
  {
   bzero(buff,sizeof(buff));
   sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
   inet_pton(AF_INET, buff, &ip);
   memcpy(net_interface[if_len].br_ip, &ip, 4);
        }
  else
  {
            char str[256];
            sprintf(str, "SIOCGIFADDR ioctl %s", buf[if_len].ifr_name);
            perror(str);
        }
 
        /*获取MAC地址 */
  if (!(ioctl(sock_raw_fd, SIOCGIFHWADDR, (char *) &buf[if_len])))
  {
   memcpy(net_interface[if_len].mac, (unsigned char *)buf[if_len].ifr_hwaddr.sa_data, 6);
  }
  else
  {
            char str[256];
            sprintf(str, "SIOCGIFHWADDR ioctl %s", buf[if_len].ifr_name);
            perror(str);
        }
  printf("---------------------------------------\n");
  printf("name=%s\n",net_interface[if_len].name);//打印接口名字
  printf("ip=%d.%d.%d.%d\n",net_interface[if_len].ip[0],net_interface[if_len].ip[1],\
  net_interface[if_len].ip[2],net_interface[if_len].ip[3]);//打印IP地址
  printf("mac=%02x:%02x:%02x:%02x:%02x:%02x\n",net_interface[if_len].mac[0],\
  net_interface[if_len].mac[1],net_interface[if_len].mac[2],net_interface[if_len].mac[3],\
  net_interface[if_len].mac[4],net_interface[if_len].mac[5]);//打印MAC地址
  printf("netmask=%d.%d.%d.%d\n",net_interface[if_len].netmask[0],\
  net_interface[if_len].netmask[1],net_interface[if_len].netmask[2],\
  net_interface[if_len].netmask[3]);//打印子网掩码
  printf("br_ip=%d.%d.%d.%d\n",net_interface[if_len].br_ip[0],net_interface[if_len].br_ip[1],\
  net_interface[if_len].br_ip[2],net_interface[if_len].br_ip[3]);//打印广播地址
  printf("flag=%d\n",net_interface[if_len].flag);//打印状态
    }
 return 0;
}
 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值