koo*_*koo 10 networking cocoa monitoring objective-c sysctl
我正在开发一个监控网络使用情况的应用.但是我注意到许多方法都不允许排除本地流量(例如,Time Machine).
我正在寻找一种排除本地流量的方法,并且只监控直接进出互联网的使用情况.
更新:感谢您的回复,现在我知道如何查找流量是否为本地流量,但我仍然不知道如何计算总输入/输出字节(对不起,如果我之前没有详细说明).我无法知道在特定时间段内或自OS启动以来在本地(或互联网)发送/接收的字节数.当OS运行时启动或终止事实过程会使这个问题进一步复杂化.
如何在linux/Mac OSX中获取网络适配器统计信息的答案?提供了一种总结总使用量的有趣方法,但它没有用,因为它总结的用法是接口统计.
更新2:我已经发布了我的最终解决方案.请向下滚动一下以查看.
我最终的工作解决方案是用来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:@""];这只是一种快速破解,在某些特殊情况下很容易失败,但是嘿,没有人抱怨,至少现在还没有。
| 归档时间: |
|
| 查看次数: |
4576 次 |
| 最近记录: |