#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#define MAXINTERFACES 16
#define MAC_ADDR_LEN 18
#define ADDR_LEN 16
void err_quit(char *msg)
{
perror(msg);
exit(1);
}
char *getIP(char *addr)
{
int sock_fd;
struct ifreq buf[MAXINTERFACES];
struct ifconf ifc;
int interface_num;
if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
err_quit("Create socket failed");
ifc.ifc_len = sizeof(buf);
ifc.ifc_req = buf;
if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)
err_quit("Get a list of interface addresses failed");
interface_num = ifc.ifc_len / sizeof(struct ifreq);
printf("The number of interfaces is %d\n", interface_num);
while(interface_num--) {
// printf("Net device: %s\n", buf[interface_num].ifr_name);
if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)
err_quit("Get the active flag word of the device");
if(buf[interface_num].ifr_flags & IFF_PROMISC)
printf("Interface is in promiscuous mode\n");
if(ioctl(sock_fd, SIOCGIFADDR, (char *)&buf[interface_num]) < 0)
err_quit("Get interface address failed");
addr = inet_ntoa(((struct sockaddr_in*)(&buf[interface_num].ifr_addr))->sin_addr);
printf("%s的IP address is %s\n",buf[interface_num].ifr_name, addr);
}
return addr;
}
char *getMAC(char *mac_addr)
{
int sock_fd;
struct ifreq buf[MAXINTERFACES];
struct ifconf ifc;
int interface_num;
if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
err_quit("Create socket failed");
ifc.ifc_len = sizeof(buf);
ifc.ifc_req = buf;
if(ioctl(sock_fd, SIOCGIFCONF, (char *)&ifc) < 0)
err_quit("Get a list of interface addresses failed");
interface_num = ifc.ifc_len / sizeof(struct ifreq);
printf("The number of interfaces is %d\n", interface_num);
while(interface_num--) {
// printf("Net device: %s\n", buf[interface_num].ifr_name);
if(ioctl(sock_fd, SIOCGIFFLAGS, (char *)&buf[interface_num]) < 0)
err_quit("Get the active flag word of the device");
if(buf[interface_num].ifr_flags & IFF_PROMISC)
printf("Interface is in promiscuous mode\n");
if(ioctl(sock_fd, SIOCGIFHWADDR, (char *)&buf[interface_num]) < 0)
err_quit("Get the hardware address of a device failed");
snprintf(mac_addr, MAC_ADDR_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[0],
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[1],
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[2],
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[3],
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[4],
(unsigned char)buf[interface_num].ifr_hwaddr.sa_data[5]);
printf("%s的Mac address is %s\n",buf[interface_num].ifr_name, mac_addr);
}
return mac_addr;
}
int main(int argc, char *argv[])
{
char addr[ADDR_LEN];
char mac_addr[MAC_ADDR_LEN];
printf("\n****************************************\n");
getIP(addr);
printf("\n****************************************\n");
getMAC(mac_addr);
printf("\n****************************************\n");
return 0;
}
linux下用代码获取系统的IP与MAC
最新推荐文章于 2023-06-27 11:28:31 发布