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]);
        }
    }
}

 

posted on 2023-06-19 17:50  为何学习  阅读(456)  评论(0编辑  收藏  举报