C / C ++プログラムで3つのネットワークインターフェイスに関する情報をTx / Rxで表示する必要があります。それらの1つはpppインターフェースですが、私のコードはppp0で機能していません。
getifaddrsのmanページ(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;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加