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