在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
What is the easiest way to get PPP0 interface Tx/Rx bytes in a custom C/C++ program?
我需要在我的 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;
}
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?