写一个code,来检测本机lP和其他的设备有IP冲突,如有则获取一个新的ip

cpp 复制代码
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <string.h>
#include <vector>
#include <unistd.h>
bool isIpConflict(const std::string& localIp, const std::vector<std::string>& ipList) {
    for (const std::string& ip : ipList) {
        if (ip != localIp) {
            return true;
        }
    }
    return false;
}

bool isIpUsed(const std::string& ip) {
    bool is_used = false;
    struct sockaddr_in sa;
    size_t len = sizeof(sa);

    if (inet_pton(AF_INET, ip.c_str(), &sa) == 0) {
        is_used = true;
    } else {
        int fd = socket(AF_INET, SOCK_STREAM, 0);
        if (fd != -1) {
            if (connect(fd, (struct sockaddr*)&sa, len) == 0) {
                is_used = true;
            }
            close(fd);
        }
    }

    return is_used;
}

// 从start到end之间的每个IP地址依次判断是否被使用,直到找到第一个未被使用的IP地址并输出
const std::string getNewIp(const std::string& ip) {
    const int start = 10;   // 起始IP地址(十进制)
    const int end = 254;     // 结束IP地址(十进制)
    const std::string subnet = ip.substr(0, ip.find_last_of('.')) + '.';  // IP地址前缀
    for (int i = start; i <= end; ++i) {
        std::string newIp = subnet + std::to_string(i);
        if (!isIpUsed(newIp)) {
            return newIp;
        }
    }
    return "";
}

int main() {
    // 本地的IP地址:192.168.159.137
    struct ifaddrs *ifaddr;
    std::vector<std::string> ipList{"192.168.159.136","192.168.159.137"}; // 模拟所获得的其他设备IP列表
    // 调用 getifaddrs() 函数获取所有网络接口信息
    if (getifaddrs(&ifaddr) == -1) {
        perror("Error getting network interfaces");
        return 1;
    }
    
    // 遍历每个网络接口
    for (struct ifaddrs* it = ifaddr; it != nullptr; it = it->ifa_next) {
        
        // 只处理 IPv4 类型的接口
        if (it->ifa_addr && it->ifa_addr->sa_family == AF_INET) {
            char ip[INET_ADDRSTRLEN];
            
            // 将 IPv4 地址转换为字符串格式并输出
            inet_ntop(AF_INET, &((sockaddr_in*)it->ifa_addr)->sin_addr, ip, INET_ADDRSTRLEN);
            if(strcmp(it->ifa_name,"ens33")==0) {
                std::cout << "Interface: " << it->ifa_name << ", IP Address: " << ip << std::endl;
                if(isIpConflict(ip,ipList)) {
                    std::cout<<"检测出本机的IP地址和其他的设备有ip地址起冲突了"<<std::endl;
                    std::cout << "获得未被使用的新IP为:"<< getNewIp(ip) << std::endl;
                }
            }
                
        }
    }
    freeifaddrs(ifaddr);
    return 0;
}
cpp 复制代码
Interface: ens33, IP Address: 192.168.159.137
检测出本机的IP地址和其他的设备有ip地址起冲突了
获得未被使用的新IP为:192.168.159.10

此题为小编自己思考做出来的,没有正确答案,仅供参考,欢迎一起学习和交流!

相关推荐
DevSecOps选型指南36 分钟前
2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
网络·安全·web安全·开源·代码审计·软件供应链安全
利刃大大1 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
国科安芯2 小时前
抗辐照MCU在卫星载荷电机控制器中的实践探索
网络·嵌入式硬件·硬件工程·智能硬件·空间计算
EasyDSS3 小时前
国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营
网络·人工智能
玩转4G物联网3 小时前
零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
服务器·网络·物联网·网络协议·tcp/ip·http·fs100p
派阿喵搞电子3 小时前
Ubuntu下有关UDP网络通信的指令
linux·服务器·网络
光芒Shine3 小时前
【物联网-ModBus-ASCII】
物联网·网络协议
搬码临时工4 小时前
外网访问内网服务器常用的三种简单操作步骤方法,本地搭建网址轻松让公网连接
服务器·网络·智能路由器
帽儿山的枪手4 小时前
程序员必掌握的iptables五表五链
linux·网络协议
Fortinet_CHINA4 小时前
引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办
网络·安全