写一个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

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

相关推荐
平生不喜凡桃李5 小时前
Linux网络:UDP
linux·网络·udp
weixiao04305 小时前
Linux网络 网络层
linux·网络·智能路由器
静若繁花_jingjing6 小时前
面试_项目问题_RPC调用异常
网络·网络协议·rpc
せいしゅん青春之我6 小时前
[JavaEE初阶] 防止网络传输中的中间人入侵---证书
服务器·网络·网络协议·java-ee
RTC老炮7 小时前
webrtc弱网-ReceiveSideCongestionController类源码分析及算法原理
网络·算法·webrtc
python百炼成钢9 小时前
3.Linux 网络相关
linux·运维·网络·stm32·单片机
2503_930123939 小时前
Kubernetes (四)网络插件详解:Flannel 与 Calico 的原理、数据流向与实战对比
网络·容器·kubernetes
星哥说事9 小时前
网络安全设备:入侵检测系统(IDS)、入侵防御系统(IPS)的配置与使用
网络·安全·web安全
问道飞鱼9 小时前
【HTTP知识】HTTP OPTIONS 预检请求深度解析与优化策略
网络·网络协议·http·option·预检
qq_4798754310 小时前
(4)计算机网络中的各种网络设备概述
网络·计算机网络·智能路由器