获取网卡ip地址代码实现

背景

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

代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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

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

你可能感兴趣的:(linux,linux)