Linux 获取本机IP地址
IP地址分为IPv4和IPv6,本文只验证了IPv4的获取,至于IPv6还没有验证。
说明:
family = AT_INET :IPv4
family = AT_INET6:IPv6
address: 提取得到的IP地址所要保存的地址
size =strlen(sampleIP) 192.168.123.128
MAX_IPv4 =15
某些头文件应在其他方面,在本程序中没用得上。不过不影响程序的编译。
program list:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <net/if.h>
#include <ifaddrs.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>
int GetIP_v4_and_v6_linux(int family, char*address, int size)
{
struct ifaddrs *ifap0,*ifap;
char buf[NI_MAXHOST];
char *interface ="eth0";
struct sockaddr_in*addr4;
struct sockaddr_in6*addr6;
int ret;
if( NULL == address )
{
return-1;
}
if(getifaddrs(&ifap0))
{
return-1;
}
for( ifap = ifap0; ifap !=NULL; ifap=ifap->ifa_next)
{
if(strcmp(interface, ifap->ifa_name) != 0)continue;
if(ifap->ifa_addr==NULL) continue;
if ((ifap->ifa_flags & IFF_UP) == 0)continue;
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("IPv4=%s\n",address);//testing
freeifaddrs(ifap0);
return 0;
}
else break;
}
else if(AF_INET6 == ifap->ifa_addr->sa_family)
{
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("IPv6=%s\n",address);//testing
freeifaddrs(ifap0);
return0;
}
elsebreak;
}
}
}
void * getIPv4()
{
static int SIZE ;
static char IP[64];
char *sampleIPv4="192.168.123.128";
SIZE = strlen(sampleIPv4);
GetIP_v4_and_v6_linux(AF_INET ,IP ,SIZE);
printf("IP=%s\n",IP);
return IP;
}
本程序非原创,也不清楚原创作者是何人。本人只是拿来修改,并应用在实际的工程项目中去。感谢原创作者和网络上的无私奉献的Linux工作者!让我们共同发扬Linux的精神!
Enjoyit!