我们在编程时常常需要获取本机的ip地址。linux下提供了很多中不同的方法。
1.命令行下 ifconfig
eth0:表示网卡0
lo:loopback地址,表示本地localhost。
2.通过程序来获取ip地址
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <unistd.h>
#include <arpa/inet.h>
int main(int argc, const char * argv[]) {
struct ifaddrs *addr = NULL;
struct ifaddrs *temp_addr = NULL;
int ret = 0;
ret = getifaddrs(&addr);
if (ret == 0) {
temp_addr = addr;
while(temp_addr != NULL) {
if(temp_addr->ifa_addr->sa_family == AF_INET) {
if(strcmp(temp_addr->ifa_name, "en0") == 0) {
printf("ip = %s\n",inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr));
}
}
temp_addr = temp_addr->ifa_next;
}
}
freeifaddrs(addr);
}
这个例子是获得网卡0的ipv4地址,这个地址一般就是我们和外界通信的ip地址。因为本机是mac下的,所以网卡名字为en0。如果为linux下,则网卡名字为eth0。其实这个网卡名字可以自己改变,通过ifconfig来查看。
3.获取本机的所有ip地址
参照man手册中的例子
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) { //通过getifaddrs函数得到所有网卡信息
perror("getifaddrs"); //通过struct ifaddr结构体由指针,将所有信息通过链表连接
exit(EXIT_FAILURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { //做链表做循环
if (ifa->ifa_addr == NULL) //判断地址是否为空
continue;
family = ifa->ifa_addr->sa_family; //得到IP地址的协议族
printf("%s address family: %d%s\n",
ifa->ifa_name, family,
(family == AF_PACKET) ? " (AF_PACKET)" : //将得到的协议族打印
(family == AF_INET) ? " (AF_INET)" :
(family == AF_INET6) ? " (AF_INET6)" : "");
if (family == AF_INET || family == AF_INET6) { //判断协议族是AF_INET还是AF_INET6
//通过getnameinfo函数得到对应的IP地址。NI_MAXHOST为宏定义,值为1025. NI_NUMERICHOST宏定义,和NI_NUMERICSERV对应,都试一下就知道了。
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\taddress: <%s>\n", host);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}
第2个例子是第三个例子中的一个特例。两个例子用到了不同函数。