获取网卡ip地址代码实现

简介: 获取网卡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等技术内容,点击立即学习:

相关文章
|
5月前
|
安全 网络安全 网络架构
IP地址的主要功能
IP地址是网络设备的唯一标识,用于数据包路由、网络通信、互操作性、安全管理和全球信息共享。它们确保数据准确传输,支持路由决策,允许设备安全互动,并打破地域限制。IP地址在不断发展的网络世界中扮演着核心角色。
|
6月前
|
负载均衡 安全 Linux
为何一个网卡需要配置多个IP地址?🌐
在Linux环境中,一个网卡配置多个IP地址是一个常见且强大的网络管理策略🛠️。这种策略不仅增加了网络的灵活性和效率,还能满足特定的网络需求和应用场景🎯。让我们一探究竟,看看在哪些情况下,为什么一个网卡会需要配置多个IP地址,并探讨不配置多个IP地址的后果。
为何一个网卡需要配置多个IP地址?🌐
|
6月前
|
负载均衡 网络架构
IP地址:是给主机配置的,还是给网卡配置的?🤔
在探索网络的奥秘时,我们经常会遇到一个看似简单但又复杂的问题:IP地址到底是配置在主机上,还是配置在网卡上?为什么我们通常说的是“主机IP地址”呢?让我们一起深入探讨。
IP地址:是给主机配置的,还是给网卡配置的?🤔
|
6月前
|
网络协议 Ubuntu 网络安全
127.0.0.1、0.0.0.0和本机ip地址的区别
127.0.0.1、0.0.0.0和本机ip地址的区别
|
关系型数据库 Apache 数据库
|
网络架构
【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
518 0
【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★