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

相关文章
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
AI 基础知识从 0.3 到 0.4——如何选对深度学习模型?
本系列文章从机器学习基础出发,逐步深入至深度学习与Transformer模型,探讨AI关键技术原理及应用。内容涵盖模型架构解析、典型模型对比、预训练与微调策略,并结合Hugging Face平台进行实战演示,适合初学者与开发者系统学习AI核心知识。
326 15
|
9月前
|
Java 调度 数据库
SpringBoot整合XXL-JOB【05】- 任务分片
在实际业务中,批量定时任务可能因上一批任务未完成而影响业务。为解决此问题,本文介绍如何使用Xxl-job对批量任务进行分片处理,通过分片广播形式调度集群机器并行执行任务,大幅提升执行效率。具体步骤包括环境准备、添加依赖和配置、声明实体类与查询类,以及改造业务逻辑实现分片查询。测试结果显示,分片处理将两千条数据的执行时间从30秒缩短至15秒,性能提升显著。
893 13
SpringBoot整合XXL-JOB【05】-  任务分片
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
存储 缓存 算法
Linux中的红黑树(rbtree)【ChatGPT】
Linux中的红黑树(rbtree)【ChatGPT】
154 13
|
JSON 人工智能 算法
pyjwt,一个强大的 Python JWT解析校验库!
pyjwt,一个强大的 Python JWT解析校验库!
521 0
|
缓存 Dubbo Java
Dubbo线程模型设计解析
该文章主要介绍了Dubbo线程模型的设计解析,包括Dubbo作为一个支持大量并发请求的网络框架的特点,以及其线程模型的工作原理。
|
数据处理 Perl
AWK 命令20条
AWK 命令示例:显示文件内容、按列打印、计数、使用分隔符、模式匹配、条件语句、数学计算、数组操作、字符串处理、循环、输出格式控制、删除重复行、统计行词字符、分组统计、格式化输出、字段联合、自定义分隔符、字符串截取和调用外部命令。AWK 是强大的文本分析工具,适用于各种数据处理任务。
399 1
|
Shell Perl
在awk中,`-v` 参数用于从命令行导入环境变量或定义自定义变量
在awk中,`-v` 参数用于从命令行导入环境变量或定义自定义变量
745 1
|
Perl
awk的BEGIN和END块
awk的BEGIN和END块
367 3