博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 获取本机的所有IP地址
阅读量:4166 次
发布时间:2019-05-26

本文共 2219 字,大约阅读时间需要 7 分钟。

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

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

示例代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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);  }

转载地址:http://gpqxi.baihongyu.com/

你可能感兴趣的文章
Java集合(4) - HashMap-put()源码解析与常见问题(二)
查看>>
Java集合(5) - HashMap查删源码解析与常见问题(三)
查看>>
Java集合(6) - LinkedHashMap源码解析
查看>>
Java集合(7) - TreeMap源码解析
查看>>
Java集合(8) - Set与AbstractSet源码解析
查看>>
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>
OKR与CFR管理模式(二)-CFR与OKR的绩效管理
查看>>
Java多线程(3) - 多线程之死锁
查看>>
Java多线程(4) - 多线程之Volatile关键字、ThreadLocal、Atomic系列类、CAS
查看>>
Java多线程(5) - 多线程之线程通讯(一)(wait、notify、join、yield、sleep区别与应用)
查看>>
Java多线程(6) - 多线程之线程通讯(二)(wait与notify案例、守护线程)
查看>>
什么是项目管理?怎么管?(二)
查看>>
Java多线程(7) - 多线程之线程停止方式
查看>>
Java设计模式(1) - 单例设计模式多种写法
查看>>
Java设计模式(2) - 工厂设计模式
查看>>
Java多线程(8) - 同步(并发)类容器详解(CopyOnWrite容器、ConcurrentMap容器、Queue队列容器)
查看>>
Java设计模式(3) - 多线程并发设计模式 - Future设计模式
查看>>
Java设计模式(5) - 多线程并发设计模式 - 生产者-消费者设计模式多种写法
查看>>
Java多线程(9) - 多线程 - 线程池详解与使用示例
查看>>
Java多线程(10) - 多线程 - CountDownLatch、CyclicBarrier、Semaphore使用示例详解
查看>>