本文共 1170 字,大约阅读时间需要 3 分钟。
http://blog.csdn.net/weiyuefei/article/details/22198659
之前项目原因,需要获取当前服务器节点上所有网口的ip地址,但是当时由于时间比较紧,一直没搞出来,最近没那么忙了,又在网上找了一下,终于实现了这一个功能,因此记录下来,以备不时之需。
这种获取所有ip的方法主要是通过遍历所有网口信息而获取的,即首先通过函数ioctl获取所有网口的信息,然后再逐一遍历每个网口,解析出网口对应的ip地址。下面是实现代码是经过验证的。
#include <stdio.h>
#include <stdlib.h> #include <unistd.h> #include <linux/types.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <net/if.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/ioctl.h>//获取地址
//返回IP地址字符串 //返回:0=成功,-1=失败 int get_all_localip() { int i = 0; int sockfd; struct ifconf ifconf; char buf[512]; struct ifreq *ifreq; char *ip; //初始化ifconf ifconf.ifc_len = 512; ifconf.ifc_buf = buf;if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{ return -1; }ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息
close(sockfd); //接下来一个一个的获取IP地址 ifreq = (struct ifreq*)buf; for(i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--) { ip = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr); if(strcmp(ip,"127.0.0.1") == 0) //排除127.0.0.1,继续下一个 { ifreq++; continue; }printf("IP地址: %s\n", ip);
ip = NULL; ifreq++; }return 0;
}int main() {
get_all_localip();
return 0; }
以上参考: