Linux下获取网卡IP,Netmask,Mac地址(gcc编译通过)
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
int GetIP(const char *ifname, unsigned char *ip)
{
int sock, ret;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, ifname);
ret = ioctl(sock, SIOCGIFADDR, &ifr, sizeof(ifr));
if (ret == 0) {
memcpy(ip, (&((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr), 4);
} else {
perror("ioctl");
}
close(sock);
return ret;
}
int GetNetMask(const char *ifname, unsigned char *netmask)
{
int sock, ret;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror( "socket" );
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, ifname);
ret = ioctl(sock, SIOCGIFNETMASK, &ifr, sizeof(ifr));
if (ret == 0) {
memcpy(netmask, (&((struct sockaddr_in *)(&ifr.ifr_netmask))->sin_addr), 4);
} else {
perror("ioctl");
}
close(sock);
return ret;
}
int GetMac(const char *ifname, unsigned char *mac)
{
int sock, ret;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_STREAM, 0);
if ( sock < 0 ) {
perror("socket");
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, ifname);
ret = ioctl(sock, SIOCGIFHWADDR, &ifr, sizeof(ifr));
if (ret == 0) {
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
} else {
perror("ioctl");
}
close(sock);
return ret;
}
int main(int argc, char *argv[])
{
int ret;
char ifname[IFNAMSIZ];
char ch[16];
unsigned char ip[4];
unsigned char netmask[4];
unsigned char mac[6];
if (argc == 1) {
strcpy(ifname, "eth2");
} else {
strcpy(ifname, argv[1]);
}
memset(ip, 0, sizeof(mac));
memset(netmask, 0, sizeof(mac));
memset(mac, 0, sizeof(mac));
ret = GetIP(ifname, ip);
if (ret == 0) {
printf("%s ip address is: %s\n", ifname, inet_ntop(AF_INET, ip, ch, 16));
} else {
fprintf(stderr, "Can't get %s's ip address\n", ifname);
}
ret = GetNetMask(ifname, netmask);
if (ret == 0) {
printf("%s netmask address is: %s\n", ifname, inet_ntop(AF_INET, netmask, ch, 16));
} else {
fprintf(stderr, "Can't get %s's netmask address\n", ifname);
}
ret = GetMac(ifname, mac);
if (ret == 0) {
printf("%s mac address is: [%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X]\n", ifname, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
} else {
fprintf(stderr, "Can't get %s's mac address\n", ifname);
}
return 0;
}