设为首页 加入收藏

TOP

Linux下获取本地IP地址--------getifaddrs
2014-11-24 03:20:01 来源: 作者: 【 】 浏览:0
Tags:Linux 获取 本地 地址 --------getifaddrs

今天在看sheepdog的时候发现了getifaddrs()这个接口,它可以查找到系统所有的网络接口的信息,包括以太网卡接口和回环接口等。利用这个接口来获取本机的IP地址真是太方便了,原来的getaddrinfo()、ioctl()或者利用套接字方法等来获取IP地址的方法都没法跟这个接口比,不仅方便,而且也非常的强大,完全不需要绑定主机名等类似的操作。看了一下glibc的源码,它是利用netlink来实现的,所以在使用这个接口的时候一定要确保你的内核支持netlink。下面是man手册中的一个例子:


#include
#include
#include
#include
#include
#include
#include


int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];


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


/* Walk through linked list, maintaining head pointer so we
* can free list later */


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


family = ifa->ifa_addr->sa_family;


/* Display interface name and family (including symbolic
* form of the latter for the common families) */


printf("%s address family: %d%s\n",
ifa->ifa_name, family,
(family == AF_PACKET) " (AF_PACKET)" :
(family == AF_INET) " (AF_INET)" :
(family == AF_INET6) " (AF_INET6)" : "");


/* For an AF_INET* interface address, display the address */


if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\taddress: <%s>\n", host);
}
}


freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android在OnCreate中获取控件的宽.. 下一篇Android 预置默认的语音信箱号码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)