Android C++读取网卡消耗流量的实现
long getInFlowSizeForAndroidByFd(int fd)
{
static const char *ath0 = "wlan";
char buf[1024*200];
lseek(fd, 0, SEEK_SET);
int nBytes = read(fd, buf, sizeof(buf)-1);
if (-1 == nBytes)
{
perror("read error");
return -1;
}
buf[nBytes] = '\0';
//返回第一次指向ath0位置的指针
char* pDev = strstr(buf, ath0);
if (NULL == pDev)
{
printf("don't find dev %s\n", ath0);
return -1;
}
char *p;
char *ifconfig_value;
int i = 0;
static long rx2_tx10[2];
/*去除空格,制表符,换行符等不需要的字段*/
for (p = strtok(pDev, " \t\r\n"); p; p = strtok(NULL, " \t\r\n"))
{
i++;
ifconfig_value = (char*)malloc(20);
strcpy(ifconfig_value, p);
long size = atol(ifconfig_value);
free(ifconfig_value);
/*获得的字符串中的第二个字段是吸收流量*/
if (i == 2) {
rx2_tx10[0] = size;
break;
}
}
return rx2_tx10[0];
}
long getInFlowSizeForAndroid() {
int fd = open("/proc/net/dev", O_RDONLY | O_EXCL);
if (-1 == fd) {
printf("/proc/net/dev not exists!\n");
return -1;
}
// 函数里存在多个return,需要把close放外部,避免遗漏
int val = getInFlowSizeForAndroidByFd(fd);
// 必须close
close(fd);
return val;
}