首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux-c getifaddrs API 例子源代码

linux-c getifaddrs API 例子源代码

原创
作者头像
tankaro
发布2025-03-21 10:37:35
发布2025-03-21 10:37:35
27700
代码可运行
举报
运行总次数:0
代码可运行
代码语言:c
代码运行次数:0
运行
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <string.h>
static void printHex(char *buffer, int cnt)
{
    for (int i = 0; i < cnt; ++i)
    {
        printf("%02x ", (unsigned char)(buffer[i]));
    }
    printf("\n");
}

int main() {
    struct ifaddrs *ifaddr, *ifa;
    char ip_str[INET6_ADDRSTRLEN];

    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        return -1;
    }

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL)
            continue;

        int family = ifa->ifa_addr->sa_family;

        printf("Interface: %s\n", ifa->ifa_name);

        if (family == AF_INET) { // IPv4
            struct sockaddr_in *in_addr = (struct sockaddr_in *)ifa->ifa_addr;
            inet_ntop(family, &in_addr->sin_addr, ip_str, sizeof(ip_str));
            printf("  IPv4 address: %s\n", ip_str);
            printHex(ip_str, strlen(ip_str));
            {
                //printf("[%s +%d %s] bootstrapNetIfName=%s\n", __FILE__, __LINE__, __func__, bootstrapNetIfName);
                //printf("[%s +%d %s] sizeof(bootstrapNetIfAddr)=%ld\n", __FILE__, __LINE__, __func__, sizeof(bootstrapNetIfAddr));
                printf("[%s +%d %s] sizeof(struct sockaddr)=%ld\n", __FILE__, __LINE__, __func__, sizeof(struct sockaddr));
                printf("[%s +%d %s] sizeof(struct sockaddr_in)=%ld\n", __FILE__, __LINE__, __func__, sizeof(struct sockaddr_in));
                printf("[%s +%d %s] sizeof(struct in_addr)=%ld\n", __FILE__, __LINE__, __func__, sizeof(struct in_addr));
                printf("[%s +%d %s] sizeof(ip_str)=%ld\n", __FILE__, __LINE__, __func__, sizeof(ip_str));
                uint64_t magic;
                memcpy(&magic, ifa->ifa_addr, sizeof(uint64_t));
                printf("[%s +%d %s] after ifa->ifa_addr magic=0x%lx\n", __FILE__, __LINE__, __func__, magic);

            }
        } else if (family == AF_INET6) { // IPv6
            struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)ifa->ifa_addr;
            inet_ntop(family, &in6_addr->sin6_addr, ip_str, sizeof(ip_str));
            printf("  IPv6 address: %s\n", ip_str);
        }
    }

    freeifaddrs(ifaddr);
    return 0;
}

代码运行结果

代码语言:shell
复制
Interface: lo
Interface: enp34s0f0
Interface: enp34s0f1
Interface: enxd20f8d0d2c79
Interface: ibp194s0f0
Interface: ibp194s0f1
Interface: docker0
Interface: lo
  IPv4 address: 127.0.0.1
31 32 37 2e 30 2e 30 2e 31
[getifaddrs.c +41 main] sizeof(struct sockaddr)=16
[getifaddrs.c +42 main] sizeof(struct sockaddr_in)=16
[getifaddrs.c +43 main] sizeof(struct in_addr)=4
[getifaddrs.c +44 main] sizeof(ip_str)=46
[getifaddrs.c +47 main] after ifa->ifa_addr magic=0x100007f00000002
[getifaddrs.c +49 main] after ifa->ifa_addr->sa_data magic=0x100007f0000
Interface: enp34s0f0
  IPv4 address: 166.111.94.236
31 36 36 2e 31 31 31 2e 39 34 2e 32 33 36
[getifaddrs.c +41 main] sizeof(struct sockaddr)=16
[getifaddrs.c +42 main] sizeof(struct sockaddr_in)=16
[getifaddrs.c +43 main] sizeof(struct in_addr)=4
[getifaddrs.c +44 main] sizeof(ip_str)=46
[getifaddrs.c +47 main] after ifa->ifa_addr magic=0xec5e6fa600000002
[getifaddrs.c +49 main] after ifa->ifa_addr->sa_data magic=0xec5e6fa60000
Interface: docker0
  IPv4 address: 172.17.0.1
31 37 32 2e 31 37 2e 30 2e 31
[getifaddrs.c +41 main] sizeof(struct sockaddr)=16
[getifaddrs.c +42 main] sizeof(struct sockaddr_in)=16
[getifaddrs.c +43 main] sizeof(struct in_addr)=4
[getifaddrs.c +44 main] sizeof(ip_str)=46
[getifaddrs.c +47 main] after ifa->ifa_addr magic=0x10011ac00000002
[getifaddrs.c +49 main] after ifa->ifa_addr->sa_data magic=0x10011ac0000
Interface: lo
  IPv6 address: ::1
Interface: enp34s0f0
  IPv6 address: 2402:f000:4:1007:809:3e:5611:fa71
Interface: enp34s0f0
  IPv6 address: fe80::9e6b:ff:fe4a:9930
Interface: enxd20f8d0d2c79
  IPv6 address: fe80::d00f:8dff:fe0d:2c79

注意:IP地址和 ifa->ifa_addr magic之间相互转换需要使用inet_ntop相关API。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档