获取网卡ip地址代码实现

背景

业务需要在访问某个接口的时候需要实时获取到当前机器的各网卡的ip信息,以下代码仅供参考。

代码实现

#include <iostream>
#include <map>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>

void PaddingSpecNetInfoByName(const char *szDevName, std::map<std::string, std::string> &netMap)
{
    int s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0)
    {
        fprintf(stderr, "Create socket failed!errno=%d", errno);
        return;
    }

    struct ifreq ifr;
    unsigned char mac[6];
    unsigned long nIP, nNetmask, nBroadIP;

    std::string netName = std::string(szDevName);
    // printf("name : %s \n", szDevName);

    auto iter = netMap.find(netName);
    if (iter == netMap.end())
    {
        strcpy(ifr.ifr_name, szDevName);
        if (ioctl(s, SIOCGIFADDR, &ifr) < 0)
        {
            nIP = 0;
        }
        else
        {
            nIP = *(unsigned long *)&ifr.ifr_broadaddr.sa_data[2];
        }
        printf("IP addr: %s \n", inet_ntoa(*(in_addr *)&nIP));
        netMap.insert(make_pair(netName, std::string(inet_ntoa(*(in_addr *)&nIP))));
    }

    close(s);
}

void GetCurrentNetCardInfo(std::map<std::string, std::string> &netMap)
{
    FILE *f = fopen("/proc/net/dev", "r");
    if (!f)
    {
        fprintf(stderr, "Open /proc/net/dev failed!errno:%dn", errno);
        return;
    }

    char szLine[512];

    fgets(szLine, sizeof(szLine), f);
    fgets(szLine, sizeof(szLine), f);

    while (fgets(szLine, sizeof(szLine), f))
    {
        char szName[128] = {0};
        sscanf(szLine, "%s", szName);
        int nLen = strlen(szName);
        if (nLen <= 0)
            continue;
        if (szName[nLen - 1] == ':')
            szName[nLen - 1] = 0;
        std::string netName = std::string(szName);
        // printf("name : %s \n", szName);
        if ((netName.find("eth") != std::string::npos) || (netName.find("en") != std::string::npos))
        {
            PaddingSpecNetInfoByName(szName, netMap);
        }
    }
    fclose(f);
    f = NULL;
}


int main()
{
	std::map<std::string, std::string> curMap;
	GetCurrentNetCardInfo(curMap);

    return 0;
}

运行结果如下:
在这里插入图片描述
注意:代码对网卡做了过滤,只能获取到以 eth 和 en 开头的网卡的ip地址。
推荐一个零声学院免费教程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值