android如何通过代码来获取每个应用访问过的ip和端口

    上一章https://blog.csdn.net/zhao007z5/article/details/79976835,通过源码分析,知道了应用访问过的Ip地址和端口都被保存到了文件中,那么只需要不断的监视文件,我们即可获得ip,port,uid。

    由于读取的文件是系统文件,不能使用普通读取文件方式。这里需要使用到命令cat,来读取数据。

  String[] ARGS ={ "cat", "/proc/net/tcp" };  execute(ARGS, "/",TYPE_TCP);
   
public void execute(String[] cmmand, String directory, int type) throws IOException{   NetInfo netInfo = null;   String sTmp = null;   ProcessBuilder builder = new ProcessBuilder(cmmand);   if (directory != null) {      builder.directory(new File(directory));   }   builder.redirectErrorStream(true);   Process process = builder.start();   InputStream is = process.getInputStream();   Scanner s = new Scanner(is);   s.useDelimiter("\n");   while(s.hasNextLine()){      sTmp = s.nextLine();      netInfo = parseData(sTmp);      if(netInfo!=null) {         netInfo.setType(type);         saveToList(netInfo);      }   }}

    "\n":用于分隔数据,通过Scanner可以轻松的读取流中的每条数据。然后通过分析数据后,每条数据中的类型又是通过“ ”来区分的。源码中也明确了这样一点

int nitems = sscanf(toybuf, " %d: %x:%x %x:%x %x %x:%x %*X:%*X %*X %d %*d %ld", 
&num, &laddr.u, &lport, &raddr.u, &rport, &state, &txq, &rxq, &uid, &inode);

        然后我们在通过字符串split函数,分隔出每个字段。但是当你打印出来的时候,你会发现其中多了不少空子串。这是因为有些项不只有一个空格,我们不能只是简单的用“ ”去区分。这里我们使用正则表达式:\s+分隔。可以分隔多个或一个空格。其中第三项既是远程Ip地址和端口项,第八项为UID

  private final static int DATA_REMOTE = 3;  private final static int DATA_UID = 8;
   
private NetInfo parseDataNew(String sData){   String sSplitItem[] = sData.split("\\s+");   String sTmp = null;   if(sSplitItem.length<9)   {      return null;   }   NetInfo netInfo = new NetInfo();   sTmp = sSplitItem[DATA_REMOTE];   String sDesItem[] = sTmp.split(":");   if(sDesItem.length<2)   {      return null;   }   netInfo.setPort(strToInt(sDesItem[1], 16, 0));   sTmp = sDesItem[0];   int len = sTmp.length();   if(len<8)   {      return null;   }   sTmp = sTmp.substring(len-8);   netInfo.setIp(strToLong(sTmp, 16, 0));   sbBuilder.setLength(0);   sbBuilder.append(strToInt(sTmp.substring(6, 8), 16, 0))         .append(".")         .append(strToInt(sTmp.substring(4, 6), 16, 0))         .append(".")         .append(strToInt(sTmp.substring(2, 4), 16, 0))         .append(".")         .append(strToInt(sTmp.substring(0, 2), 16, 0));   sTmp = sbBuilder.toString();   netInfo.setAddress(sTmp);   if(sTmp.equals("0.0.0.0")) {      return null;   }   sTmp =sSplitItem[DATA_UID];   netInfo.setUid(strToInt(sTmp, 10, 0));   return netInfo;}

    通过这章基本了解了读取和解析。如果需要获取那个应用使用了哪些IP和端口,还需要读取应用信息,然后将数据合并在一起。如果需要这部分的可以参考GIT:https://github.com/zhao007z4/IP-Monitor


上一篇:android从源码中看netstat命令

下一篇:VpnService截获网络数据包

更多相关文章

  1. android InputStream中read()与read(byte[] b)
  2. Android框架之MVP实践
  3. Android(安卓)Handler类 一看就懂
  4. opencv在android预览上实现灰化/感应触屏/边缘检测(3)
  5. Android的HttpClient和WebView session不同的问题
  6. MVP模式在Android开发中的最佳实践
  7. 【开发框架】GreenDao数据库框架的搭建和使用
  8. Android---Android下嵌入式数据库SqlLite使用方法
  9. Android(安卓)提交数据到服务器的四种方法

随机推荐

  1. Android(安卓)SparseArray的用法
  2. Android使double保留两位小数的多方法 ja
  3. 如何使用eclipse和emulator debug Androi
  4. Linux x86 编译 Android(安卓)遭遇 gnu/s
  5. Android 基于4.4系统截屏的三指截屏
  6. 实现硬件访问服务
  7. android 程序开发 R.### cannot be resol
  8. Android /data空间小
  9. 【Android 基础】EditText的属性介绍
  10. Android(安卓)Studio打包APK是遇到的一些