现代c++获取linux所有的网络接口名称

现代c++获取linux所有的网络接口名称

前言


本文介绍一种使用c++获取本地所有网络接口名称的方法。

一、在linux中查看网络接口名称

linux系统中可以使用ifconfig -a命令列举出本机所有网络接口。如下图所示

也可以使用ip a命令,如下图所示

二、使用c++代码获取

需要包含<ifaddrs.h><sys/types.h>头文件

写下如下图代码

cpp 复制代码
#include <string>
#include <sys/types.h>
#include <vector>
#include <ifaddrs.h>

std::vector<std::string> interfaceNames() {
    std::vector<std::string> names;
    struct ifaddrs *ifaddr{nullptr};
    if (getifaddrs(&ifaddr) == 0) {
        for (auto ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
            if (ifa->ifa_addr->sa_family == AF_PACKET) {
                names.push_back(ifa->ifa_name);
            }
        }
        freeifaddrs(ifaddr);
    }
    return names;
}

为了打印方便,我们重载一下左移运算符

cpp 复制代码
std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
    os << "[";
    for (auto &s : v) {
        os << s;
        if (&s != &v.back()) {
            os << ",";
        }
    }
    return os << "]";
}

三、验证

main.cppmain函数中写下如下代码

cpp 复制代码
int main(int argc, char **argv) {
    std::cout << interfaceNames() << std::endl;
    return 0;
}

编译并验证,g++ main.cpp -o main && ./main,结果如下

确实可以获取到接口名称。

四、完整代码如下

cpp 复制代码
#include <ifaddrs.h>
#include <iostream>
#include <string>
#include <sys/types.h>
#include <vector>

std::vector<std::string> interfaceNames() {
    std::vector<std::string> names;
    struct ifaddrs *ifaddr{nullptr};
    if (getifaddrs(&ifaddr) == 0) {
        for (auto ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
            if (ifa->ifa_addr->sa_family == AF_PACKET) {
                names.push_back(ifa->ifa_name);
            }
        }
        freeifaddrs(ifaddr);
    }
    return names;
}

std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
    os << "[";
    for (auto &s : v) {
        os << s;
        if (&s != &v.back()) {
            os << ",";
        }
    }
    return os << "]";
}

int main(int argc, char **argv) {
    std::cout << interfaceNames() << std::endl;
    return 0;
}

五、总结

本文介绍了一种使用c++获取本地所有网络接口的方法,亲测可用!!!

相关推荐
苦逼的猿宝15 小时前
基于springboot的课程作业管理系统(源码+论文)
java·毕业设计·springboot·计算机毕业设计
带土115 小时前
7. 线程编程(线程概念和创建)
linux
我本楚狂人www15 小时前
Spring 两大核心思想(一):IoC
java·数据库·spring
华清远见IT开放实验室15 小时前
硬核根基,智能载体:华清远见嵌入式“硬件+仿真+课程+师资”产教融合与实践教学方案
linux·人工智能·stm32·物联网·嵌入式·虚拟仿真
Anthony_23115 小时前
Linux 防火墙完全指南:从 iptables 到 firewalld
linux·运维·服务器
月走乂山15 小时前
Linux 服务器安装 CC Switch GUI 工具 + VNC 远程桌面完整教程
linux·运维·服务器
手可摘星辰的少年15 小时前
二级指针到底在改什么?——从C语言基础到Linux内核文件系统注册机制
linux
九皇叔叔15 小时前
高斯性能分析【第一天】单表执行计划分析
java·数据库·性能分析·执行计划·gauss
苦逼的猿宝15 小时前
基于springboot的社区团购系统设计(源码+论文)
java·毕业设计·springboot·计算机毕业设计
电魂泡哥15 小时前
RocketMQ Dledger 集群与 Raft 协议
java·rocketmq·java-rocketmq