监控不包括本地流量的网络使

koo*_*koo 10 networking cocoa monitoring objective-c sysctl

我正在开发一个监控网络使用情况的应用.但是我注意到许多方法都不允许排除本地流量(例如,Time Machine).

我正在寻找一种排除本地流量的方法,并且只监控直接进出互联网的使用情况.

更新:感谢您的回复,现在我知道如何查找流量是否为本地流量,但我仍然不知道如何计算总输入/输出字节(对不起,如果我之前没有详细说明).我无法知道在特定时间段内或自OS启动以来在本地(或互联网)发送/接收的字节数.当OS运行时启动或终止事实过程会使这个问题进一步复杂化.

如何在linux/Mac OSX中获取网络适配器统计信息的答案提供了一种总结总使用量的有趣方法,但它没有用,因为它总结的用法是接口统计.

更新2:我已经发布了我的最终解决方案.请向下滚动一下以查看.

koo*_*koo 0

我最终的工作解决方案是用来libpcap实现这一目标。当然,它也有一些缺点,包括它需要提升权限,并且必须捕获所有过滤的数据包来计算统计数据,但至少它工作得很好。

许多文档和教程都libpcap相当详尽和清晰,我建议每个对这个解决方案感兴趣的人都看看那些相对较少的 google-fu 工作。

另外,一些人可能会感兴趣,我的互联网流量过滤器如下 -

- (NSString *)_internetFilterStringForInterface:(AKNetworkInterface *)interface
    inOrOut:(BOOL)inYesOutNo
{
    if (![interface net] || ![interface mask] || IsEmpty([interface addresses]))
    {
        return nil;
    }

    NSString *hostType = inYesOutNo ? @"dst" : @"src";
    NSString *host = nil;
    for (NSString *hostComponent in [interface addresses])
    {
        if (IsEmpty(hostComponent)) continue;
        if (!host)
            host = [NSString stringWithFormat:@"(%@ host %@", hostType, hostComponent];
        else
            host = [host stringByAppendingFormat:@" or %@ host %@", hostType, hostComponent];
    }
    host = [host stringByAppendingString:@")"];

    NSString *net = [interface netString];
    net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];

    NSString *filter = [NSString stringWithFormat:
                        @"ip and (not %@ net %@) and %@",
                        inYesOutNo ? @"src" : @"dst",
                        net, host];
    return filter;
}
Run Code Online (Sandbox Code Playgroud)

该过滤器的设计包含一些关于什么算作“本地流量”的答案,我知道它不包含一些边缘情况,例如双 NAT 配置等,但我希望看到有关此的建议。

我知道net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];这只是一种快速破解,在某些特殊情况下很容易失败,但是嘿,没有人抱怨,至少现在还没有。