#include
#include
#include
#include
#include
#include
// 模拟运行命令并获取输出的函数
std::string runCommand(const std::string& command) {
// 假设返回的是 LLDP 结果的字符串
// 你可以用 system() 或其他库函数来执行命令
return R"(
GigabitEthernet0/0/4 has 2 neighbor(s):
Neighbor index :1
Chassis ID :3cc7-867d-
Port ID :GigabitEthernet0/0/2
Expired time :95s
Neighbor index :2
Chassis ID :162c-e113-2f21
Port ID :eth1
Expired time :100s
)";
}
// 解析 LLDP 结果并返回邻居设备列表
struct NeighborInfo {
std::string chassisID;
std::string portID;
int expiredTime;
};
std::vector parseLldpResult(const std::string& result) {
std::vector neighbors;
// 使用正则表达式提取邻居设备的信息
std::regex neighborRegex(R"(Neighbor index\s+:\d+[\s\S]*?Chassis ID\s+:(\S+)[\s\S]*?Port ID\s+:(\S+)[\s\S]*?Expired time\s+:(\d+)s)");
std::smatch match;
std::string::const_iterator searchStart(result.cbegin());
while (std::regex_search(searchStart, result.cend(), match, neighborRegex)) {
NeighborInfo neighbor;
neighbor.chassisID = match[1];
neighbor.portID = match[2];
neighbor.expiredTime = std::stoi(match[3]);
neighbors.push_back(neighbor);
searchStart = match.suffix().first;
}
return neighbors;
}
// 检查 LLDP 数据是否稳定
bool isLldpDataStable(const std::vector& lastNeighbors, const std::vector& currentNeighbors) {
// 检查设备数量是否一致
if (lastNeighbors.size() != currentNeighbors.size()) {
return false;
}
// 检查每个邻居设备的Chassis ID和Port ID是否一致,以及过期时间是否趋于稳定
for (size_t i = 0; i < lastNeighbors.size(); ++i) {
if (lastNeighbors[i].chassisID != currentNeighbors[i].chassisID ||
lastNeighbors[i].portID != currentNeighbors[i].portID) {
return false;
}
// 如果过期时间差异较大,说明数据还不稳定
if (abs(lastNeighbors[i].expiredTime - currentNeighbors[i].expiredTime) > 5) {
return false;
}
}
return true;
}
// 等待 LLDP 数据稳定的函数
std::vector waitForStableLldpData(int maxWaitTime = 30, int checkInterval = 2) {
std::vector lastNeighbors;
int elapsedTime = 0;
while (elapsedTime < maxWaitTime) {
// 获取当前 LLDP 数据
std::string result = runCommand("display lldp neighbor");
std::vector<NeighborInfo> currentNeighbors = parseLldpResult(result);
// 如果上次的数据和本次一致,并且邻居设备的过期时间稳定,则认为数据稳定
if (!lastNeighbors.empty() && isLldpDataStable(lastNeighbors, currentNeighbors)) {
return currentNeighbors; // 数据稳定,返回结果
}
lastNeighbors = currentNeighbors;
std::this_thread::sleep_for(std::chrono::seconds(checkInterval));
elapsedTime += checkInterval;
}
// 超时处理,返回最后一次的结果
return lastNeighbors;
}
int main() {
std::vector neighbors = waitForStableLldpData();
if (neighbors.empty()) {
std::cout << "未检测到稳定的 LLDP 数据。" << std::endl;
} else {
std::cout << "获得稳定的 LLDP 数据:" << std::endl;
for (const auto& neighbor : neighbors) {
std::cout << "Chassis ID: " << neighbor.chassisID << ", Port ID: " << neighbor.portID
<< ", Expired time: " << neighbor.expiredTime << "s" << std::endl;
}
}
return 0;
}