linux 下获取本机ip地址

7 篇文章 0 订阅

我们在编程时常常需要获取本机的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个例子是第三个例子中的一个特例。两个例子用到了不同函数。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值