165 lines
5.5 KiB
C++
165 lines
5.5 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>
|
||
|
||
|
||
#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;
|
||
extern INTERFACE net_interface[MAXINTERFACES];//接口数据
|
||
|
||
/******************************************************************
|
||
函 数: int getinterface()
|
||
功 能: 获取接口信息
|
||
参 数: 无
|
||
*******************************************************************/
|
||
extern void getinterface();
|
||
|
||
/******************************************************************
|
||
函 数: int get_interface_num()
|
||
功 能: 获取实际接口数量
|
||
参 数: 接口数量
|
||
*******************************************************************/
|
||
int get_interface_num();
|
||
|
||
|
||
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);
|
||
/* 获得接口标志 */
|
||
if (!(ioctl(sock_raw_fd, SIOCGIFFLAGS, (char *) &buf[if_len]))){
|
||
/* 接口状态 */
|
||
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]))){
|
||
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(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, "SIOCGIFADDR 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
|
||
}
|
||
|
||
|
||
|
||
int main()
|
||
{
|
||
|
||
getinterface();
|
||
return 0;
|
||
}
|