linux 获取本机的所有IP地址

本文详细介绍了在Linux环境下获取本地IP地址的方法,包括如何使用getifaddrs函数遍历所有网络接口,并筛选出有效的IPv4和IPv6地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux下获取本地的ip地址,我这里只介绍一种,亲测有效,包括你虚拟出来的IP地址也可以显示出来。

先说一下可能大家都有听过的使用 gethostname 函数和 gethostbyname 函数获得本机的IP地址,其实获得的是127.0.0.1,是一个回环的地址。而不是真正的本机IP地址。

示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#include <ifaddrs.h>

int GetIP_v4_and_v6_linux(int family,char *address,int size)
{
  struct ifaddrs *ifap0,*ifap;
  char buf[NI_MAXHOST];
  struct sockaddr_in *addr4;
  struct sockaddr_in6 *addr6;
  int ret;
  if(NULL == address)
  {
  printf("in address");  
  return -1;
  }
  //getifaddrs可以获取到本地所以得网卡名字,可以打印出来看看
  if(getifaddrs(&ifap0))
  {
    return -1;
  }
  for(ifap = ifap0;ifap!=NULL;ifap=ifap->ifa_next)
  {
    if(ifap->ifa_addr == NULL) continue;
    if((ifap->ifa_flags & IFF_UP) == 0) continue;
    //协议簇好像不只是v4 v6还有个packet什么的 ,好像是原始套接字,没特别注意
    if(family!=ifap->ifa_addr->sa_family) continue;

    if(AF_INET == ifap->ifa_addr->sa_family)
    { 
      
      addr4 = (struct sockaddr_in *)ifap->ifa_addr;
    //讲网络字节序转换成点分十进制
      if(NULL != inet_ntop(ifap->ifa_addr->sa_family,(void *)&(addr4->sin_addr),buf,NI_MAXHOST))
      {
        if(size <=strlen(buf)) break;
        strcpy(address,buf);
        printf("address %s\n",address);
      }
      else break;
    }
    else if(AF_INET6 == ifap->ifa_addr->sa_family)//这里就是v6的版本,其实是一样的
    {
      addr6 = (struct sockaddr_in6*) ifap->ifa_addr;
      if(IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr))
      {
        continue;
      }
      if(IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr))
      {
        continue;
      }
      if(IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr))
      {
        continue;
      }
      if(IN6_IS_ADDR_UNSPECIFIED(&addr6->sin6_addr))
      {
        continue;
      }
      if(IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr))
      {
        continue;
      }
      if(NULL != inet_ntop(ifap->ifa_addr->sa_family,(void *)&(addr6->sin6_addr),buf,NI_MAXHOST))
      {
        if(size <= strlen(buf)) break;
        strcpy(address,buf);
		printf("address %s\n",address);
      }
      else break; 
    } 
  }
  freeifaddrs(ifap0);
  return -1;
}
int main(void)
{
  char ip_addr[16];
  char *ip ;
  ip= ip_addr;
  
  GetIP_v4_and_v6_linux(AF_INET,ip,16);

  printf("ip addrss %s\n", ip);
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值