#ifdef SOLARIS
#include #endif
#define MAXINTERFACES 16 /* 最大接口数 */
int main(int argc, char **argv)
{
register int fd, intrface, retn = 0;
struct ifreq buf[MAXINTERFACES]; /* ifreq结构数组 */
struct arpreq arp;
struct ifconf ifc;
if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) >= 0)
{
ifc.ifc_len = sizeof buf;
ifc.ifc_buf = (caddr_t) buf;
if (!ioctl (fd, SIOCGIFCONF, (char *) &ifc))
{
//获取接口数量信息
intrface = ifc.ifc_len / sizeof (struct ifreq);
printf("interface num is intrface=%dn",intrface);
puts("");
//根据借口信息循环获取设备IP和MAC地址
while ( (intrface--) > 0)
{
//获取设备名称
printf ("net device %sn", buf[intrface].ifr_name);
//判断网卡类型
if (!(ioctl (fd, SIOCGIFFLAGS, (char *) &buf[intrface])))
{
if (buf[intrface].ifr_flags & IFF_PROMISC)
{
puts ("the interface is PROMISC");
retn++;
}
}
else
{
char str[256];
sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}
//判断网卡状态
if (buf[intrface].ifr_flags & IFF_UP)
{
puts("the interface status is UP");
}
else
{
puts("the interface status is DOWN");
}
//获取当前网卡的IP地址
if (!(ioctl (fd, SIOCGIFADDR, (char *) &buf[intrface])))
{
printf("IP address is:");
puts((char *)inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));
//printf("n%dn"buf[intrface].ifr_addr))->sin_addr.s_addr);
//puts (buf[intrface].ifr_addr.sa_data);
}
else
{
char str[256];
sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}
/* this section can't get Hardware Address,I don't know whether the reason is module driver*/
#ifdef SOLARIS
//获取MAC地址
arp.arp_pa.sa_family = AF_INET;
arp.arp_ha.sa_family = AF_INET;
((struct sockaddr_in*)&arp.arp_pa)->sin_addr.s_addr=((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr.s_addr;
if (!(ioctl (fd, SIOCGARP, (char *) &arp)))
{
printf("HW address is:");
//以十六进制显示MAC地址
printf("%02x:%02x:%02x:%02x:%02x:%02xn",
(unsigned char)arp.arp_ha.sa_data[0],
(unsigned char)arp.arp_ha.sa_data[1],
(unsigned char)arp.arp_ha.sa_data[2],
(unsigned char)arp.arp_ha.sa_data[3],
(unsigned char)arp.arp_ha.sa_data[4],
(unsigned char)arp.arp_ha.sa_data[5]);
puts("");
puts("");
}
#else
#if 0
/*Get HW ADDRESS of the net card */
if (!(ioctl (fd, SIOCGENADDR, (char *) &buf[intrface])))
{
printf("HW address is:");
printf("%02x:%02x:%02x:%02x:%02x:%02xn",
(unsigned char)buf[intrface].ifr_enaddr[0],
(unsigned char)buf[intrface].ifr_enaddr[1],
(unsigned char)buf[intrface].ifr_enaddr[2],
(unsigned char)buf[intrface].ifr_enaddr[3],
(unsigned char)buf[intrface].ifr_enaddr[4],
(unsigned char)buf[intrface].ifr_enaddr[5]);
puts("");
}
#endif
if (!(ioctl (fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
{
printf("HW address is:");
printf("%02x:%02x:%02x:%02x:%02x:%02xn",
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[0],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[1],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[2],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[3],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[4],
(unsigned char)buf[intrface].ifr_hwaddr.sa_data[5]);
}
#endif
else
{
char str[256];
sprintf (str, "cpm: ioctl device %s", buf[intrface].ifr_name);
perror (str);
}
//子网掩码
if (!(ioctl(fd, SIOCGIFNETMASK, (char *) &buf[intrface])))
{
printf("MASK:%s",
(char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr));
puts("");
}
else
{
char str[256];
sprintf(str, "SIOCGIFADDR ioctl %s", buf[intrface].ifr_name);
perror(str);
}
//广播地址
if (! (ioctl(fd, SIOCGIFBRDADDR, (char *) &buf[intrface])))
printf("Broadcast Address:%sn",
(char*)inet_ntoa(((struct sockaddr_in*) (&buf[intrface].ifr_addr))->sin_addr));
puts("");
puts("");
} //while
} else
perror ("cpm: ioctl");
} else
perror ("cpm: socket");
close (fd);
return retn;
}
/*
#include int ioctl(int fd, int request, … * void *arg *);
返回:成功返回0,失败返回-1
char *inet_ntoa (struct in_addr);
返回点分十进制的字符串在静态内存中的指针。
所在头文件:函数功能:将网络地址转换成“.”点隔的字符串格式。
所需库: winsock.h
#includestruct ifconf
{
intifc_len;/* size of buffer*
union
{
char __user *ifcu_buf;
struct ifreq __user *ifcu_req;
} ifc_ifcu;
};
struct ifreq
{
#define IFHWADDRLEN6
union
{
charifrn_name[IFNAMSIZ];* if name, e.g. "en0" *
} ifr_ifrn;
union {
structsockaddr ifru_addr;
structsockaddr ifru_dstaddr;
structsockaddr ifru_broadaddr;
structsockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
shortifru_flags;
intifru_ivalue;
intifru_mtu;
struct ifmap ifru_map;
charifru_slave[IFNAMSIZ];/* Just fits the size *
charifru_newname[IFNAMSIZ];
void __user *ifru_data;
structif_settings ifru_settings;
} ifr_ifru;
};
#define ifr_nameifr_ifrn.ifrn_name/* interface name *
#define ifr_hwaddrifr_ifru.ifru_hwaddr/* MAC address *
#defineifr_addrifr_ifru.ifru_addr/* address*
#defineifr_dstaddrifr_ifru.ifru_dstaddr/* other end of p-p lnk*
#defineifr_broadaddrifr_ifru.ifru_broadaddr/* broadcast address*
#defineifr_netmaskifr_ifru.ifru_netmask/* interface net mask*
#defineifr_flagsifr_ifru.ifru_flags/* flags*
#defineifr_metricifr_ifru.ifru_ivalue/* metric*
#defineifr_mtuifr_ifru.ifru_mtu/* mtu*
#define ifr_mapifr_ifru.ifru_map/* device map
#define ifr_slaveifr_ifru.ifru_slave/* slave device*
#defineifr_dataifr_ifru.ifru_data/* for use by interface*
#define ifr_ifindexifr_ifru.ifru_ivalue/* interface index
#define ifr_bandwidthifr_ifru.ifru_ivalue /* link bandwidth*
#define ifr_qlenifr_ifru.ifru_ivalue/* Queue length *
#define ifr_newnameifr_ifru.ifru_newname/* New name*
#define ifr_settingsifr_ifru.ifru_settings/* Device/proto settings*
*/
本文发布于:2024-02-04 12:03:11,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170706759355390.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |