[英]How to get network device stats?
I tried some examples. 我尝试了一些例子。 Part is for old linux-api, part does not compiles, part is depends on kernel version.
部分用于旧版linux-api,部分未编译,部分取决于内核版本。
I need transmitted and recieved bytes on evice by its name. 我需要在发送时通过名称接收和接收字节。
Trying this, but dont know how to set default namespace or init_net: 尝试此操作,但不知道如何设置默认名称空间或init_net:
#include <linux/netdevice.h>
struct net_device *dev;
dev = (struct net_device*) dev_get_by_name(&init_net,"eth0");
Is posible to get stats from posix sockets
, not from netdevice
? 是否可以从
posix sockets
而不是从netdevice
获取统计信息?
There is simpler approach. 有更简单的方法。 copied from http://man7.org/linux/man-pages/man3/getifaddrs.3.html
从http://man7.org/linux/man-pages/man3/getifaddrs.3.html复制
VERSIONS top 版本顶部
The getifaddrs() function first appeared in glibc 2.3, but before
glibc 2.3.3, the implementation supported only IPv4 addresses; IPv6
support was added in glibc 2.3.3. Support of address families other
than IPv4 is available only on kernels that support netlink.
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/if_link.h>
int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s, n;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
if (ifa->ifa_addr == NULL)
continue;
family = ifa->ifa_addr->sa_family;
/* Display interface name and family (including symbolic
form of the latter for the common families) */
printf("%-8s %s (%d)\n",
ifa->ifa_name,
(family == AF_PACKET) ? "AF_PACKET" :
(family == AF_INET) ? "AF_INET" :
(family == AF_INET6) ? "AF_INET6" : "???",
family);
/* For an AF_INET* interface address, display the address */
if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST,
NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\t\taddress: <%s>\n", host);
} else if (family == AF_PACKET && ifa->ifa_data != NULL) {
struct rtnl_link_stats *stats = (struct rtnl_link_stats *)ifa->ifa_data;
printf("\t\ttx_packets = %10u; rx_packets = %10u\n"
"\t\ttx_bytes = %10u; rx_bytes = %10u\n",
stats->tx_packets, stats->rx_packets,
stats->tx_bytes, stats->rx_bytes);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}
您可以使用mii-tool或ethtool从网络phy获取统计信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.