博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux C如何获取服务器节点上所有网口的ip地址
阅读量:4096 次
发布时间:2019-05-25

本文共 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;
}

 

以上参考:

你可能感兴趣的文章
angularjs中的$watch
查看>>
点击旋转图片90度-jquery
查看>>
angualrjs--resolve使用
查看>>
AngularJS 无限滚动加载数据控件 ngInfiniteScroll
查看>>
用jsp实现登录,登录成功则跳转到登录成功页面,失败则跳转到失败页面
查看>>
jsp-session
查看>>
jsp--javabeans
查看>>
上传图片时预览获取图片原始的宽度和size大小
查看>>
web.xml文件的作用及基本配置
查看>>
HTML5头部信息解释
查看>>
angularjs默认选中--包括省市联动的默认选中
查看>>
加载页面时同时触发两个ajax请求,数据显示的顺序不一致
查看>>
浅谈ajax异步和同步加载的区别
查看>>
angualrjs实现分页查询
查看>>
js倒计时--截止某日期的倒计时和截止每晚12点的倒计时
查看>>
angularjs 使用ui.router 去掉url中的#号
查看>>
angularjs-controller的另外一种写法
查看>>
angularjs-$modalInstance传值
查看>>
angularjs验证表单
查看>>
angularjs上传图片控件
查看>>