原理
使用 getifaddrs
接口获取网卡信息。
实现
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family;
char host[NI_MAXHOST];
// 获取网卡信息
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
// 遍历网卡
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL) continue;
family = ifa->ifa_addr->sa_family;
// 输出网卡名称,协议
printf("%s address family: %d%s ", ifa->ifa_name, family,
(family == PF_PACKET) ? " (AF_PACKET)"
: (family == PF_INET) ? " (AF_INET)"
: (family == PF_INET6) ? " (AF_INET6)"
: "");
// 输出IP地址
if (family == PF_INET) {
in_addr* tmpAddrPtr =
&((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
inet_ntop(PF_INET, tmpAddrPtr, host, INET_ADDRSTRLEN);
printf("\taddress: <%s>\n", host);
}
if (family == PF_INET6) {
in_addr* tmpAddrPtr =
&((struct sockaddr_in*)ifa->ifa_addr)->sin_addr;
inet_ntop(PF_INET6, tmpAddrPtr, host, INET6_ADDRSTRLEN);
printf("\taddress: <%s>\n", host);
}
printf("\n");
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}