#include <stdio.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
/*****************************************************
* 函数功能:获取本机所有ip地址。
* 输入参数:
* max_ip_num: ip_buf能存的最多ip个数;
* 输出参数:
* ip_buf[][]: 本机的ip地址以字符串形式依次存放于ip_buf[0] ip_buf[1]...
* 返回值:
* 获取到ip地址的个数。
******************************************************/
int get_local_ip(char (*ip_buf)[20], int max_ip_num)
{
int i = 0;
int sockfd;
struct ifconf ifc;
char buf[1024] = {0};
char ipbuf[20] = {0};
struct ifreq *ifr;
ifc.ifc_len = 1024;
ifc.ifc_buf = buf;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
return -1;
}
ioctl(sockfd, SIOCGIFCONF, &ifc);
ifr = (struct ifreq*)buf;
int num = 0;
for (i = (ifc.ifc_len/sizeof(struct ifreq)); i > 0; i--) {
// printf("net name: %s\n", ifr->ifr_name);
inet_ntop(AF_INET, &((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr, ip_buf[num++], 20);
// printf("ip: %s\n", ipbuf);
ifr = ifr + 1;
if (num >= max_ip_num) {
break;
}
}
return num;
}
void main()
{
char ip_buf[10][20] = {0};
int ip_num = get_local_ip(ip_buf, 10);
printf("ip_num:%d\n", ip_num);
if (ip_num > 0) {
int i = 0;
for (i = 0; i < ip_num; i++) {
printf("ip[%d]:%s\n", i, ip_buf[i]);
}
}
}