[英]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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.