gpt4 book ai didi

c++ - 使用 getifaddrs 获取 CAN 接口(interface)数据包统计信息

转载 作者:行者123 更新时间:2023-12-04 11:43:29 26 4
gpt4 key购买 nike

我正在使用 getifaddrs Linux 函数,用于在运行 Debian Jessie 内核 3.16.0 的 Linux 机器上获取有关网络接口(interface)的信息。
我想知道的信息包括网络统计信息(丢弃、发送的数据包等),正如 getifaddrs 的联机帮助页所述,它包含在 rtnl_link_stats 中。 ifaddrs::ifa_addr::ifa_data指向的结构当ifaddrs::if_addr::sa_family设置为 AF_PACKET .
这适用于以太网接口(interface),但不适用于机器上的 CAN 接口(interface),因为 ifaddrs::ifa_addr为 NULL,因此 AF_PACKET永远不会为任何 CAN 接口(interface)返回。
以下 C++ 代码...

#include <ifaddrs.h>
#include <linux/if_link.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/types.h>

#include <cstdio>
#include <cstdlib>

int main() {
ifaddrs *addrs;
if (getifaddrs(&addrs) == -1) {
perror("getifaddrs");
return EXIT_FAILURE;
}

printf("AF_PACKET: %d\n\n", (int)AF_PACKET);

for (auto addr = addrs; addr != NULL; addr = addr->ifa_next) {
if (addr->ifa_addr != nullptr) {
printf("%s: family: %d\n", addr->ifa_name, (int)addr->ifa_addr->sa_family);
} else {
printf("%s: family: none\n", addr->ifa_name);
}
}

freeifaddrs(addrs);

return EXIT_SUCCESS;
}
...打印出来
AF_PACKET: 17

lo: family: 17
eth0: family: 17
eth1: family: 17
can0: family: none
can1: family: none
lo: family: 2
eth1: family: 2
lo: family: 10
eth1: family: 10
这意味着两个 CAN 接口(interface)都没有任何系列集。 ifconfig命令显示信息没有问题,但是:
can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
UP RUNNING NOARP MTU:16 Metric:1
RX packets:28481588 errors:0 dropped:8729866 overruns:0 frame:0
TX packets:8168599 errors:2292404 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:211108099 (201.3 MiB) TX bytes:64828340 (61.8 MiB)
Interrupt:17

can1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17
(注意我只包括了 CAN 接口(interface)的输出,而不是其余的)
我究竟做错了什么?检索 CAN 接口(interface)的数据包统计信息的正确方法是什么?

最佳答案

在“ifconfig”命令中使用“address_family”选项;检查您的“man ifconfig”页面,这是我的相关文本(我的系统上没有 CAN intfs):

...
address_family
Specify the address family which affects interpretation of the remaining parameters. Since an interface
can receive transmissions in differing protocols with different naming schemes, specifying the address
family is recommended. The address or protocol families currently supported are ``inet'', ``inet6'', and
``link''. The default is ``inet''. ``ether'' and ``lladdr'' are synonyms for ``link''.

关于c++ - 使用 getifaddrs 获取 CAN 接口(interface)数据包统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68997651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com