152 lines
5.1 KiB
C
152 lines
5.1 KiB
C
#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>
|
||
#include "get_interface.h"
|
||
|
||
int interface_num=0;//接口数量
|
||
INTERFACE net_interface[MAXINTERFACES];//接口数据
|
||
|
||
/******************************************************************
|
||
函 数: int get_interface_num()
|
||
功 能: 获取接口数量
|
||
参 数: 无
|
||
*******************************************************************/
|
||
int get_interface_num(){
|
||
return interface_num;
|
||
}
|
||
|
||
/******************************************************************
|
||
函 数: int getinterface()
|
||
功 能: 获取接口信息
|
||
参 数: 无
|
||
*******************************************************************/
|
||
void getinterface()
|
||
{
|
||
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("interface_num=%d\n\n", interface_num);
|
||
char buff[20]="";
|
||
int ip;
|
||
int if_len = interface_num;
|
||
while (if_len-- > 0)
|
||
{ /* 遍历每个接口 */
|
||
printf("%s\n", buf[if_len].ifr_name); /* 接口名称 */
|
||
sprintf(net_interface[if_len].name, "%s", buf[if_len].ifr_name); /* 接口名称 */
|
||
printf("-%d-%s--\n",if_len,net_interface[if_len].name);
|
||
/* 获得接口标志、flags值 */
|
||
if (!(ioctl(sock_raw_fd, SIOCGIFFLAGS, (char *) &buf[if_len])))
|
||
{
|
||
/* 接口状态 */
|
||
/*IFF_UP :网络装置是否正常启用,不会因插拔网络线而有任何变化*/
|
||
if (buf[if_len].ifr_flags & IFF_UP){
|
||
printf("UP\n");
|
||
net_interface[if_len].flag = 1;
|
||
}
|
||
else{
|
||
printf("DOWN\n");
|
||
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])))
|
||
{
|
||
/*inet_ntoa将一个网络字节序的IP地址(也就是结构体in_addr类型变量)
|
||
转化为点分十进制的IP地址(字符串)*/
|
||
printf("IP:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
|
||
bzero(buff,sizeof(buff));
|
||
sprintf(buff, "%s", (char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
|
||
|
||
/*新型网路地址转化函数inet_pton:
|
||
将点分十进制的ip地址转化为用于网络传输的数值格式*/
|
||
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])))
|
||
{
|
||
printf("netmask:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
|
||
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])))
|
||
{
|
||
printf("br_ip:%s\n",(char*)inet_ntoa(((struct sockaddr_in*) (&buf[if_len].ifr_addr))->sin_addr));
|
||
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, "SIOCGIF./ADDR ioctl %s", buf[if_len].ifr_name);
|
||
perror(str);
|
||
}
|
||
|
||
/*MAC地址 */
|
||
if (!(ioctl(sock_raw_fd, SIOCGIFHWADDR, (char *) &buf[if_len])))
|
||
{
|
||
printf("MAC:%02x:%02x:%02x:%02x:%02x:%02x\n\n",
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[0],
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[1],
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[2],
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[3],
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[4],
|
||
(unsigned char) buf[if_len].ifr_hwaddr.sa_data[5]);
|
||
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);
|
||
}
|
||
}//–while end
|
||
close(sock_raw_fd); //关闭socket
|
||
}
|
||
|