How to get network adapter stats in linux/Mac OSX?

前端 未结 3 1335
别跟我提以往
别跟我提以往 2020-11-28 08:40

I\'m looking for a way to get hold of network stats in C on Linux and MacOSX. Specifically, I need to monitor the number of bytes uploaded and downloaded from each network a

相关标签:
3条回答
  • 2020-11-28 08:49

    on Linux:

    • low level: check /sys/class/net/eth0/statistics/
    • slightly higher level: ip -s link show eth0
    • graphical: iftop
    • interactive: iptraf
    0 讨论(0)
  • 2020-11-28 08:50

    I can't speak to OSX but on linux take a look at /proc/net/dev.

    If you do 'cat /proc/net/dev' you should see statistics including 'bytes' - the total number of bytes of data transmitted or received by the interface. You can read the file within your own program.

    EDIT:

    I didn't read your whole question. This article should help you get started with /proc and has a section on /proc/net/dev.

    Also, to list the interfaces you can call ioctl with the SIOCGIFCONF option. You can Google for a decent code example on how to loop through the returned data. Or you can simply pull it out of the /proc.net/dev data mentioned above, which should be easier.

    0 讨论(0)
  • 2020-11-28 09:07

    The Darwin netstat source code uses sysctl. Here's some code that prints the number of bytes in and out on OSX:

    #import <Foundation/Foundation.h>
    #include <sys/sysctl.h>
    #include <netinet/in.h>
    #include <net/if.h>
    #include <net/route.h>
    
    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        int mib[] = {
            CTL_NET,
            PF_ROUTE,
            0,
            0,
            NET_RT_IFLIST2,
            0
        };
        size_t len;
        if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
            fprintf(stderr, "sysctl: %s\n", strerror(errno));
            exit(1);
        }
        char *buf = (char *)malloc(len);
        if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
            fprintf(stderr, "sysctl: %s\n", strerror(errno));
            exit(1);
        }
        char *lim = buf + len;
        char *next = NULL;
        u_int64_t totalibytes = 0;
        u_int64_t totalobytes = 0;
        for (next = buf; next < lim; ) {
            struct if_msghdr *ifm = (struct if_msghdr *)next;
            next += ifm->ifm_msglen;
            if (ifm->ifm_type == RTM_IFINFO2) {
                struct if_msghdr2 *if2m = (struct if_msghdr2 *)ifm;
                totalibytes += if2m->ifm_data.ifi_ibytes;
                totalobytes += if2m->ifm_data.ifi_obytes;
            }
        }
        printf("total ibytes %qu\tobytes %qu\n", totalibytes, totalobytes);
        [pool drain];
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题