#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
static int get_ip_by_ifname(char *ifname, struct in_addr *ipaddr)
{
int sockfd;
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
memset(&ifr, 0, sizeof(struct ifreq)); //初始化ifr
if(ifname == NULL)
{
printf("Error: must specify the interface name!\n");
return -1;
}
strcpy(ifr.ifr_name, ifname);
sin->sin_family = AF_INET;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("Error: creat socket failed!\n");
return -1;
}
if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) != 0) //获取接口状态
{
printf("Error: ioctl SIOCGIFFLAGS!\n");
close(sockfd);
return -1;
}
printf("Status of interface %s is %s. \n", ifname, (ifr.ifr_flags & IFF_UP) ? "UP" : "DOWN");
if(ioctl(sockfd, SIOCGIFADDR, &ifr) !=0 ) //获取接口IP地址
{
printf("Error: ioctl SIOCGIFADDR!\n");
close(sockfd);
return -1;
}
memcpy(ipaddr, &sin->sin_addr, sizeof(sin->sin_addr));
close(sockfd);
return 0;
}
int main(int argc, char *argv[])
{
char *ifname;
int result;
struct in_addr ipaddr;
char string[INET_ADDRSTRLEN];
if(argc == 1)
{
printf("Usage:\n");
printf("getip <interface name> \n");
printf("Example: getip eth0\n");
return 1;
}
ifname = argv[1];
if(get_ip_by_ifname(ifname, &ipaddr) != 0)
{
printf("Get interface %s ip address failed!\n", ifname);
return 1;
}
if(inet_ntop(AF_INET, &ipaddr, string, INET_ADDRSTRLEN) == NULL)
{
printf("inet_ntop() failed!\n");
return 1;
}
printf("IP address of %s: %s \n", ifname, string);
return 0;
}
编译运行结果:
test@Product-Name:~$ ./getip eth0
Status of interface eth0 is UP.
IP address of eth0: 192.168.111.3