c++判断lldp是否稳定示例代码

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值