草庐IT

android TrafficStats getUidRxBytes 不准确

coder 2023-12-28 原文

我写了一个小的 android 应用程序,发送 Http 请求,从服务器接收响应,并计算传输和接收的字节数。 代码如下

long receivedBytes = TrafficStats.getUidRxBytes(uid)-lastNumer

我发现 receivedBytes 总是大于 http Header+http Body 的大小,例如 我在服务器中捕获(使用 wireshark)的实际 http 帧大小为 1645 字节( header +正文),但 android API 返回 receivedBytes 为 1912,因此传输。

TrafficStats getUidRxBytes 本身不准确(可能这个问题是我的平台 samsung i9300 和 cynogenmod 10.3 特有的)

最后,我找到了计算数据使用量的正确方法我找到了其他方法来计算数据使用量,这似乎比 TrafficStats API 更准确。(非常感谢 here)

private long[] getStat() {
    String line, line2;
    long[] stats = new long[2];
    try {
        File fileSnd = new File("/proc/uid_stat/"+uid+"/tcp_snd");
        File fileRcv = new File ("/proc/uid_stat/"+uid+"/tcp_rcv");
        BufferedReader br1 = new BufferedReader(new FileReader(fileSnd));
        BufferedReader br2 = new BufferedReader(new FileReader(fileRcv));
        while ((line = br1.readLine()) != null&& (line2 = br2.readLine()) != null) {
            stats[0] = Long.parseLong(line);
            stats[1] = Long.parseLong(line2);
        }
        br1.close();
        br2.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return stats;
}

最佳答案

我看到您已经找到了解决方案,但我会在您的问题上添加我的想法,因为它可能对其他人有用(在谷歌搜索如何使用 TrafficStats API 后,我自己最终来到这里)。

API documentation状态:

Statistics are measured at the network layer, so they include both TCP and UDP usage.

文档确实可以更详尽,但我倾向于说可以假设返回的字节数还包括构成传输层 header 和网络层 header 的字节

HTTP is an application layer protocol .当您将预期字节计算为 HTTP header 字节加上 HTTP 正文字节时,您只处理应用程序层字节,因此不考虑传输层和网络层 header 字节。我假设 TCP 用于下载。 This adds a header ranging from 20 to 60 bytes .此外,假设您使用 IPv4 进行下载。 This also adds a header ranging from 20 to 60 bytes .

显然这不会占整个 1912 - 1645 = 267 字节,但它可能会给你/其他人一些线索。


有点离题,但还是相关的。目前尚不清楚 TrafficStats API 是否实际计算 header 字节数。根据this answer , API 计算 header 字节。但是,考虑到上面列出的 API 文档,链接的答案可能规定了不正确的内容(至少对于 API 级别 21 而言并非如此)。此外,this question还暗示 TrafficStats 实际上在计算网络和传输层 header 字节(查看评论)。


TrafficStats 实际上计算网络和传输层 header 字节。参见 kernel sourceTrafficStatsTest .

关于android TrafficStats getUidRxBytes 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25440796/

有关android TrafficStats getUidRxBytes 不准确的更多相关文章

  1. javascript - $(window).scroll 不准确,快速滚动时 - 2

    我试图操纵元素的位置,所以在某些页面滚动位置之间,他的css发生了变化。看看这个简单的例子:http://jsfiddle.net/6RtTX/8/问题是-$(window).scroll不是那么准确,所以如果我滚动得非常快,它就会变得非常困惑。这个问题有解决办法吗?我可以在$(window).scroll方法中对这些操作进行排队吗?提前致谢。 最佳答案 试着像这样改变你的fiddle的代码:$(window).scroll(function(event){if(event.pageY>100&&event.pageY通过使用传递的

  2. javascript - jquery鼠标移动捕获不准确 - 2

    我遇到了一个奇怪的问题。我用以下方法捕捉鼠标移动:varmmoves=[];jQuery(document).mousemove(function(event){mmoves.push({x:event.pageX,y:event.pageY})}然后我将一个div附加到页面,如:$("body").append('*');然后尝试回放Action它在大多数页面上工作正常,但在某些页面上播放开始(“*”初始位置)右侧(x)的一些像素。y没问题,但x向右大约120px。在其他页面上它是准确的。在不准确的页面上,当鼠标靠近右侧滚动条时,它会超出右侧页面边框并产生水平滚动条。我认为这与正在播

  3. javascript - 拆分过大的路径时,Google Maps Elevation Service 响应不准确 - 2

    这是一个有点详细的问题,所以让我先解释一下情况,然后是我的实现,最后是问题,以便您最好地理解。截至4月4日,添加了更新并将问题缩小到一个待处理的问题,有关最新信息,请参阅此问题的底部。TLDR;我有一条从GoogleMapsDirectionsAPI返回的长路线,并且想要该路线的高程图。太糟糕了,它不起作用,因为它是通过GET请求的,并且URL最大长度为2.048个字符,超出了。我拆分了请求;使用Promises保证正确的处理顺序;但海拔数据并不总是完整的完整路线,并不总是以正确的顺序显示,并不总是遵循给定的路径,有时高程间的位置跨越几公里。介绍;尝试为GoogleMapsDirect

  4. parsing - Golang ParseFloat 在示例中不准确 - 2

    我一直在做一个项目,我必须将字符串转换为uint,以确保一些货币值匹配:total,err:=strconv.ParseFloat(paymentResp.Transactions[0].Amount.Total,64)iferr!=nil{returnctx.JSON(http.StatusBadRequest,err.Error())}ifo.TotalPrice!=uint(total*100){returnctx.JSON(http.StatusBadRequest,"Unabletoverifyamountpaid")}但是当我尝试对几个数字执行strconv.ParseFl

  5. c# - 是什么让我的计时器运行不准确? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我有一个创建新计时器的类,并在每次计时时轮询远程队列(通过HTTP)。publicvoidStart(){_timer=newTimer((x)=>{Console.WriteLine(DateTime.Now.ToString("hh:MM:ss.fff")+""+typeof(T).Name);varmessage=(Message)null;varm

  6. C#/.NET Timers 和 Win32 Sleep 函数都不准确 - 2

    对于下面的代码:实际间隔始终是1014.01毫秒而不是1000毫秒...我也尝试过在C++中使用System.Windows.Forms.Timer、System.Threading.Timer和WinAPISleep(int)函数,但额外增加的14.01ms始终存在。Windows8的系统时钟是准确的,但.NET计时器和WindowsAPI的Sleep(int)函数都不准确。publicpartialclassForm1:Form{privatelongticks;publicForm1(){InitializeComponent();}privatevoidForm1_Load(o

  7. python - `ip = ipaddress.ip_address(args.ip)` 的 TCP 端口测试不准确 - 2

    在此测试机中,tcp/80正在监听,而tcp/4444未监听。(我已经用netstat-an验证了这一点)如果我简单地将args.ip值传递给ip,并将其转发给scan()函数,扫描结果总是准确的.ip=args.ip正常输出:C:\>pythonscript.py127.0.0.1Portnumber:80Connectingto127.0.0.1:80OK127.0.0.1:80C:\>pythonscript.py127.0.0.1Portnumber:4444Connectingto127.0.0.1:4444FAIL127.0.0.1:4444C:\>但是,当我尝试使用以下函

  8. c# - System.Timers.Timer 非常不准确 - 2

    我编写了一个程序,它通过Parallel.ForEach使用所有可用的核心。ForEach的列表包含约1000个对象,每个对象的计算需要一些时间(约10秒)。在这种情况下,我设置了一个这样的计时器:timer=newSystem.Timers.Timer();timer.Elapsed+=TimerHandler;timer.Interval=15000;timer.Enabled=true;privatevoidTimerHandler(objectsource,ElapsedEventArgse){Console.WriteLine(DateTime.Now+":Timerfire

  9. Javascript Math.cos 和 Math.sin 不准确。有什么解决办法吗? - 2

    Javascript数学三Angular函数返回错误结果。尝试alert(Math.sin(Math.PI));它不返回0。也许问题出在javascript十进制数精度上。是否有任何解决方法来获得正确的结果? 最佳答案 不过,它非常非常接近于零。(~10^-16)alert(Math.sin(Math.PI/2))确实返回1。这只是您在处理浮点运算时必须注意的事情之一。到处都会出现舍入错误。 关于JavascriptMath.cos和Math.sin不准确。有什么解决办法吗?,我们在St

  10. php - PHP 中的日期不准确 - 2

    我有这个代码:$expiration_date='2041-07-14'$epoch_timestamp_expiration_date=strtotime($expiration_date);//Get7days$seven_days_ago=7*86400;//subtractsevendaysfromtheexpirationdate.$epoch_timestamp_expiration_date-=$seven_days_ago;//Formatthenewexpirationdate-7daysago$formatted_epoch_time=date('Y-m-d',$e

随机推荐