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;
}
以上参考:http://zhumeng8337797.blog.163.com/blog/static/1007689142012311082638/