#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;
}
代码运行结果
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 删除。