首页 > 系统相关 >如何获取LINUX主机所有的IP

如何获取LINUX主机所有的IP

时间:2023-01-17 13:35:40浏览次数:36  
标签:ifpoint addr IP LINUX ifa 主机 ifhead include struct

上个月写了一篇文章,介绍了如何获取本机的第一个IP。后面我再想是否有办法获取LINUX主机的所有的IP,通过查询资料,找到了方法。

借助对象ifaddrs以及getifaddrs函数可以实现这样的功能。

     

#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
  char hostname[100]={0};
  char localIpAddress[256]={0};
  struct hostent *h;
  gethostname(hostname,sizeof(hostname));
  printf("host name is %s \n",hostname);
  h=gethostbyname(hostname);
  //struct in_addr *temp;
  //temp=(struct in_addr *)h->h_addr;
  //strcpy(localIpAddress,inet_ntoa(*temp));
  //printf("first ip is %s\n",localIpAddress);
  char mac[30]={0};
  struct ifaddrs * ifhead=NULL;
  struct ifaddrs * ifpoint=NULL;
  struct in_addr * intmpAddrPtr=NULL;
  getifaddrs(&ifhead);
  ifpoint=ifhead;
  while(ifpoint!=NULL)
  {
    if(ifpoint->ifa_addr->sa_family==AF_INET)
    {
       intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr;
       char addressBuffer[INET_ADDRSTRLEN];
       inet_ntop(AF_INET, intmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
       printf("%s IPv4: %s\n", ifpoint->ifa_name, addressBuffer);
    }
    else if(ifpoint->ifa_addr->sa_family==AF_INET6)
    {
      intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr;
      char addressBuffer[INET6_ADDRSTRLEN];
      inet_ntop(AF_INET6, intmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
      printf("%s IPv6: %s\n", ifpoint->ifa_name, addressBuffer); 
    }
     ifpoint=ifpoint->ifa_next;
  }
  if (ifhead) 
  {
       freeifaddrs(ifhead); 
       ifhead = NULL; 
  }
}

其中通过ifpoint=ifpoint->ifa_next;可以实现对主机IP的遍历查看。通过intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr;可以获取到in_addr的指针。通过函数inet_ntop可以将16进制的IP地址转成字符形式的XX.XX.XX.XX这样的形式展示。

编译及运行实例代码如下:

如何获取LINUX主机所有的IP_tcp/ip

 

标签:ifpoint,addr,IP,LINUX,ifa,主机,ifhead,include,struct
From: https://blog.51cto.com/u_15942605/6017169

相关文章

  • 多IP情况下如何获取本地的第一个IP及如何调整本地的第一个IP
    昨天交付的同事联系我,相同的业务,但线上系统中,OPTIONS消息的Via地址是20网段的,但测试系统中的Via地址是181网段的。他说感到非常的奇怪。我分析了业务的代码,OPTIONS中的Vi......
  • JavaScript知识总结
    文章目录1、什么是JavaScript1.1、概述1.2、历史2、快速入门2.1、引入JavaScript2.2、基本语法入门2.3、数据类型2.4、严格检查模式3、数据类型3.1、字符串......
  • Linux中安装Git 2.39.0
    1、依赖安装yuminstalldh-autoreconfcurl-develexpat-develgettext-developenssl-develperl-develzlib-develnss-y2、移除默认的gityumremovegit-y3......
  • linux命令详解
    万字详解Linux常用指令(值得收藏)运维网工 2023-01-0109:00 发表于重庆收录于合集#linux命令12个#linux11个#linux常用命令4个来源:https://blog.csdn.n......
  • javaScript中为什么字符串相减是NAN Why is “string” - “string” NaN?
    发现这个问题的背景是后端返回数据根据组排序,然后每个组中的对象按照某个字段进行排序显示一开始是这样的  并不生效修改后    排序生效。可以看到只......
  • MySQL安装-Linux版
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/......
  • MySQL卸载-Linux版
    MySQL卸载-Linux版停止MySQL服务systemctlstopmysqld查询MySQL的安装文件rpm-qa|grep-imysql卸载上述查询出来的所有的MySQL安装包rpm-emysql-community......
  • 回收linux中的cache
    Linux内存中的Cache真的能被回收么?入门小站 入门小站 2023-01-0922:15 发表于湖北收录于合集#Linux677个#内存3个入门小站分享运维技巧及10k+S......
  • Iptables原理介绍
    Linux防火墙——iptables原理介绍原创 liugp 大数据与云原生技术分享 2023-01-0207:30 发表于广东收录于合集#linux13个#防火墙3个#iptables2个一、......
  • linux 软链接 硬链接 区别
    来源  https://www.cnblogs.com/oceanftd/p/13475643.html 相关概念:链接:简单说,链接就是一种文件共享的方式,是POSIX中的概念,主流文件系统都支持链接文件。in......