linux的IP及虚IP(附加IP)获取打印

如下为C++代码

cpp 复制代码
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h> // Add this header for 'close' function
#include <stdio.h>
#define MAX_IFS_NUM      64
#define MAC_ADDR_LEN     6
#define IP_ADDR_LEN      4

struct netif_info{
    char ifname[IFNAMSIZ];
    char ifreal[IFNAMSIZ];
    unsigned char macaddr[IFHWADDRLEN];
    int ifindex;
    in_addr_t ip;
    in_addr_t mask;
    short int flags;
};

int GetNetifList(netif_info netifs[MAX_IFS_NUM], int &num) {
    int ret = 0;
    int sockfd;
    struct ifconf ifc;
    struct ifreq  ifs[MAX_IFS_NUM];
    struct ifreq  ifr;
    struct sockaddr_in *addr;
    int nsize;

    num = 0;
    sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (sockfd == -1)
        return -1;
    ifc.ifc_len = sizeof(ifs);
    ifc.ifc_req = ifs;
    if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
        ret = -2;
        goto exit;
    }
    nsize = ifc.ifc_len / sizeof(struct ifreq);
    if (nsize > MAX_IFS_NUM) {
        ret = -3;
        goto exit;
    }
    for (int n = 0; n < nsize; ++n) {
        ifr = ifc.ifc_req[n];
        strncpy(netifs[num].ifname, ifr.ifr_name, IFNAMSIZ);
        strncpy(netifs[num].ifreal, ifr.ifr_name, IFNAMSIZ); // Assuming ifname and ifreal are the same initially

        if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {
            ret = -7;
            goto exit;
        }
        netifs[num].flags = ifr.ifr_flags;

        // Get IP address
        if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) {
            netifs[num].ip = 0;
        } else {
            addr = (struct sockaddr_in*)&ifr.ifr_addr;
            netifs[num].ip = addr->sin_addr.s_addr;
        }

        // Get subnet mask
        if (ioctl(sockfd, SIOCGIFNETMASK, &ifr) < 0) {
            netifs[num].mask = 0;
        } else {
            addr = (struct sockaddr_in*)&ifr.ifr_netmask;
            netifs[num].mask = addr->sin_addr.s_addr;
        }

        if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) {
            ret = -5;
            goto exit;
        }
        netifs[num].ifindex = ifr.ifr_ifindex;

        if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
            ret = -8;
        } else {
            memcpy(netifs[num].macaddr, ifr.ifr_hwaddr.sa_data, MAC_ADDR_LEN);
        }

        ++num;
    }

exit:
    close(sockfd);
    return ret;
}

int main() {
    int num;
    netif_info netifs[MAX_IFS_NUM];
    int ret = GetNetifList(netifs, num);
    if (ret != 0) {
        std::cerr << "Failed to get network interface list. Error code: " << ret << std::endl;
        return ret;
    }

    std::cout << "Number of network interfaces: " << num << std::endl;
    std::cout << "---------------------------------" << std::endl;

    for (int i = 0; i < num; ++i) {
        std::cout << "Interface Name: " << netifs[i].ifname << std::endl;

        std::cout << "IP Address: ";
        for (int j = 0; j < IP_ADDR_LEN; ++j) {
            std::cout << ((netifs[i].ip >> (j * 8)) & 0xFF);
            if (j < IP_ADDR_LEN - 1) {
                std::cout << ".";
            }
        }
        std::cout << std::endl;

        std::cout << "Subnet Mask: ";
        for (int j = 0; j < IP_ADDR_LEN; ++j) {
            std::cout << ((netifs[i].mask >> (j * 8)) & 0xFF);
            if (j < IP_ADDR_LEN - 1) {
                std::cout << ".";
            }
        }
        std::cout << std::endl;

        std::cout << "Interface Index: " << netifs[i].ifindex << std::endl;

        std::cout << "MAC Address: ";
        for (int j = 0; j < MAC_ADDR_LEN; ++j) {
            printf("%02X", netifs[i].macaddr[j]);
            if (j < MAC_ADDR_LEN - 1) {
                printf(":");
            }
        }
        std::cout << std::endl;

        std::cout << "Real Interface Name: " << netifs[i].ifreal << std::endl;

        std::cout << "---------------------------------" << std::endl;
    }

    return 0;
}

如下为命令操作:

查看虚IP

ip -f inet addr

删除指定虚IP

ip addr del 172.x.x.x dev ens33

新增虚IP:

ifconfig ens33:1 172.x.x.x netmask 255.255.250.0

以上注意需要加:1这些来新增一个设备,添加完后在ifconfig 能看到新加的IP。

如下的命令给加到同一个设备上,导致ifconfig看不到,ip a下看得到:

ip addr add 192.168.0.102/24 dev eth0

相关推荐
Android系统攻城狮2 小时前
Linux PipeWire深度解析之pw_factory_create_object调用流程与实战(七十二)
linux·音频进阶·pipewire音频进阶
lsh曙光2 小时前
playbook剧本(2)--Ansible变量
linux·运维·网络
lengjingzju2 小时前
编译与调试完全指南—第14章 系统配置与调优
linux
ly76893 小时前
Docker 从入门到实践:镜像、容器、Dockerfile 与 Docker Compose 详解
运维·docker·容器
大鹏的NLP博客3 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
用户3169353811833 小时前
ry.bat和ry.sh部署
运维
mennekes4 小时前
自动化产线临时配电:明装工业插座 vs 面板式工业插座 vs 模块化插座箱取舍
运维·科技·安全·制造
tedcloud1234 小时前
book-to-skill 怎么部署?把技术书和项目文档变成 AI Agent 可复用知识
linux·运维·服务器·人工智能·开源
旗开得胜马到成功4 小时前
SK海力士SSD售后翻车:企业备份介质裸奔风险与中科热备技术选型拆解
运维·服务器·网络
7177774 小时前
厘清 Gitee Test 能力边界:测试管理、自动化与 DevSecOps 协同路径
运维·gitee·自动化