在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?

What is the easiest way to get PPP0 interface Tx/Rx bytes in a custom C/C++ program?

本文关键字:字节 Rx 最简单 方法 是什么 Tx PPP0 C++ 自定义 程序 获取      更新时间:2023-10-16

我需要在我的 C/C++程序中显示有关三个网络接口的 Tx/Rx 信息。其中之一是 ppp 接口,但我的代码不适用于 ppp0。

我正在使用getifaddrs手册页中的代码示例(参见man getifaddrs),它基本上检查接口是否具有AF_PACKET系列,如果是,那么它从ifaddrs结构的ifa->ifa_data成员中检索Tx/Rx信息。但是此代码对于 ppp0 接口失败。在互联网上搜索,我找到了 pppstats 的源代码,但我看到代码有些繁琐,因为它有很多用于条件代码编译的 ifdef。我看到必须使用 ioctl,但我不知道具体如何使用。

在Linux

系统中从ppp0获取Tx/Rx字节信息的最简单代码是什么?真的需要使用 ioctl 吗?

提前致谢

我目前处于同样的情况,今天花了一些时间研究和编码这个问题。我也从查看pppstats源代码开始。

在Linux

系统中从ppp0获取Tx/Rx字节信息的最简单代码是什么?真的需要使用 ioctl 吗?

虽然我无法真正回答您的确切问题,但这是我最终在 ppp0 接口上读取 RX/TX 字节的 (c++) 代码:

#include <linux/if_ppp.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <unistd.h>
{
    auto sockfd = ::socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        std::cout << "couldn't open socket : " << errno << std::endl;
        return;
    }
    ifreq req {};
    ppp_stats stats {};
    req.ifr_data = reinterpret_cast<caddr_t>(&stats);
    ::strncpy(&req.ifr_name[0], "ppp0", sizeof(req.ifr_name));
    auto ret = ::ioctl(sockfd, SIOCGPPPSTATS, &req);
    if (ret < 0) {
        std::cout << "couldn't get PPP statistics : " << errno << std::endl;
    } else {
        std::cout << "received bytes : " << stats.p.ppp_ibytes << std::endl;
        std::cout << "sent bytes : " << stats.p.ppp_obytes << std::endl;
    }
    auto ret = ::close(sockfd);
    if (ret != 0) {
        std::cout << "couldn't close socket : " << errno << std::endl;
    }
}