获取网卡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月前
|
网络协议 Ubuntu 网络安全
127.0.0.1、0.0.0.0和本机ip地址的区别
127.0.0.1、0.0.0.0和本机ip地址的区别
|
6月前
|
网络协议 CDN
IP地址相关讲解
IP地址相关讲解
57 0
IP地址分类以及C类IP地址的子网划分
IP地址分类以及C类IP地址的子网划分
176 0
|
网络协议 网络架构 数据格式
IP 地址
IP网络地址采用“网络●主机”的形式,其中网络部分是网络的地址编码,主机部分是网 络中一个主机的地址编码。IP 地址的格式如图下所示。
375 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 地址网络号主机号数量 )★