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