linux C语言 使用socket获取本机所有IP地址
#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]); } } }