本文共 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/