如何获取LINUX主机所有的IP

简介: 如何获取LINUX主机所有的IP

上个月写了一篇文章,介绍了如何获取本机的第一个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这样的形式展示。


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


cd292702cb8e4199a45d27973abd107c.png

相关文章
|
2月前
|
Ubuntu Linux
linux怎么查看自己的ip地址
在Linux系统中,有多种方法可以查看自己的IP地址。
217 2
|
2月前
|
监控 安全 Linux
【专栏】Linux中六个常用的网络命令:ping、traceroute、netstat、nmap、ifconfig和ip
【4月更文挑战第28天】本文介绍了Linux中六个常用的网络命令:ping、traceroute、netstat、nmap、ifconfig和ip,以及它们在测试网络连通性、追踪路由、查看网络状态、安全扫描和接口配置等场景的应用。通过学习和运用这些命令,系统管理员和网络爱好者能更有效地诊断和管理网络问题,确保网络稳定运行。
|
1月前
|
网络协议 Linux 网络安全
Linux命令hostnamectl:掌握系统主机信息的利器
`hostnamectl`是Linux系统管理的关键工具,用于查看和设置主机名、内核信息等。它集成在`systemd`中,通过修改配置文件交互。命令特点包括综合显示多种信息、简单语法和设置功能。例如,`hostnamectl status`显示系统详情,`sudo hostnamectl set-hostname NEWHOSTNAME`用于更改主机名。使用时注意权限、备份配置、更新网络和重启相关服务,避免频繁更改。
|
10天前
|
网络协议 Linux 开发工具
配置Linux固定IP地址,为什么要固定IP,因为他是通DHCP服务获取的,DHCP服务每次重启都会重新获取一次ip,VMware编辑中有一个虚拟网络编辑器
配置Linux固定IP地址,为什么要固定IP,因为他是通DHCP服务获取的,DHCP服务每次重启都会重新获取一次ip,VMware编辑中有一个虚拟网络编辑器
|
12天前
|
监控 算法 Linux
Linux下工具tc详细讲解及限制IP和端口实例
TC (Traffic Control) 是Linux内核中提供的一个用于控制和管理网络流量的强大工具,它允许用户实现QoS(Quality of Service)策略,包括带宽限制、优先级控制、延迟保证等。TC基于内核的队列 discipline (qdisc) 和流量类别(class) 体系结构,允许对进入或离开网络接口的数据流进行复杂的整形和过滤。
|
12天前
|
域名解析 网络协议 Linux
linux网络-- 手动配置ip地址
linux网络-- 手动配置ip地址
|
18天前
|
移动开发 网络协议 Linux
Linux系统中查看路由表的命令(ip route)
Linux系统中查看路由表的命令(ip route)
15 0
|
1月前
|
Linux Shell
IP地址库Linux系统从APNIC获取地址库
IP地址库Linux系统从APNIC获取地址库
25 1
|
2月前
|
Ubuntu 网络协议 Linux
|
1月前
|
安全 Linux 数据处理
Linux hostid命令:主机标识符的奥秘
Linux hostid命令:主机标识符的奥秘