1. service netd /system/bin/netd
  2.     class main
  3.     socket netd stream 0660 root system
  4.     socket dnsproxyd stream 0660 root inet

启动/system/bin/netd应用程序为服务,入口函数为main,创建2个名字分别为netd和dnsproxyd的本地socket连接。分别对应:

  1. root@android:/ # ll /dev/socket/
  2. srwxrwxrwx root inet 1970-01-01 00:00 dnsproxyd
  3. srwxrwxrwx root system 1970-01-01 00:00 netd

备注:socket关键字用法,

  1. 代码阅读(注:由于说第一次分析netd的代码,我完全跟踪此代码的流程来看,先说init.rc,然后是main,之后依次展开):
  2. //main.cpp:main

  3. int main() {
  4. //........

  5.     if (!(nm = NetlinkManager::Instance())) { //NetlinkManager需要分析,一眼看出它为单根模式。看看他到底做来什么?

  6.         LOGE("Unable to create NetlinkManager");
  7.         exit(1);
  8.     };
  9.  
     
  10.  
     
  11.     cl = new CommandListener();//CommandListener需要分析

  12.     nm->setBroadcaster((SocketListener *) cl);
  13.  
     
  14.     if (nm->start()) { //直接看start函数。
  15.         LOGE("Unable to start NetlinkManager (%s)", strerror(errno));
  16.         exit(1);
  17.     }
  18.  
     
  19.     /*
  20.      * Now that we're up, we can respond to commands
  21.      */

  22.     if (cl->startListener()) {
  23.         LOGE("Unable to start CommandListener (%s)", strerror(errno));
  24.         exit(1);
  25.     }
  26.  
     
  27.     // Eventually we'll become the monitoring thread

  28.     while(1) {
  29.         sleep(1000);
  30.     }
  31.  
     
  32.     LOGI("Netd exiting");
  33.     exit(0);
  34. }

    直接跟进看NetlinkManager::start()

  35. int NetlinkManager::start() {
  36.     struct sockaddr_nl nladdr;
  37.     int sz = 64 * 1024;
  38.  
     
  39.     memset(&nladdr, 0, sizeof(nladdr));
  40.     nladdr.nl_family = AF_NETLINK;
  41.     nladdr.nl_pid = getpid();
  42.     nladdr.nl_groups = 0xffffffff;
  43.  
     
  44.     if ((mSock = socket(PF_NETLINK,
  45.                         SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
  46.         LOGE("Unable to create uevent socket: %s", strerror(errno));
  47.         return -1;
  48.     }
  49.  
     
  50.     if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) {
  51.         LOGE("Unable to set uevent socket options: %s", strerror(errno));
  52.         return -1;
  53.     }
  54.     if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
  55.         LOGE("Unable to bind uevent socket: %s", strerror(errno));
  56.         return -1;
  57.     }
  58.  
     
  59.     mHandler = new NetlinkHandler(this, mSock);
  60.     if (mHandler->start()) {
  61.         LOGE("Unable to start NetlinkHandler: %s", strerror(errno));
  62.         return -1;
  63.     }
  64.     return 0;
  65. }

    看NetlinkHandler类:

  66. #ifndef _NETLINKHANDLER_H
  67. #define _NETLINKHANDLER_H
  68.  
     
  69. #include <sysutils/NetlinkListener.h>
  70. #include "NetlinkManager.h"
  71.  
     
  72. class NetlinkHandler: public
    NetlinkListener { // NetlinkListener类之前有分析,这个是网络监听的框架实现类。

  73.     NetlinkManager *mNm;
  74.  
     
  75. public:
  76.     NetlinkHandler(NetlinkManager *nm, int listenerSocket);
  77.     virtual ~NetlinkHandler();
  78.  
     
  79.     int start(void);
  80.     int stop(void);
  81.  
     
  82. protected:
  83.     virtual
    void onEvent(NetlinkEvent *evt);
  84.  
     
  85.     void notifyInterfaceAdded(const
    char *name);
  86.     void notifyInterfaceRemoved(const
    char *name);
  87.     void notifyInterfaceChanged(const
    char *name, bool isUp);
  88. };
  89. #endif

    晕死,怎么排版乱完了,而且还丢失了部分数据。

  

Netd学习笔记的更多相关文章

  1. Android(java)学习笔记160:Framework运行环境之 Android进程产生过程

    1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...

  2. Android(java)学习笔记103:Framework运行环境之 Android进程产生过程

    1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. loadrunner11.0之IP欺骗

    一:设置虚拟ip地址 操作步骤: 1:添加ip地址 运行loadrunner---tools---IP wizard 2:选择create  new setting,点击"下一步" ...

  2. 来自高维的对抗 - 逆向TinyTool自制

    一.序 无论是逆向分析还是漏洞利用,我所理解的攻防博弈无非是二者在既定的某一阶段,以高维的方式进行对抗,并不断地升级维度.比如,逆向工程人员一般会选择在Root的环境下对App进行调试分析,其是以ro ...

  3. 粗谈shell脚本风格

    注意:此风格并非官方版本,为个人在编写和维护脚本程序时总结出来的民间版本.0. 开头:除去开头的#!/bin/bash,最前面的就是脚本描述注释了,视个人喜好而定,例如: ############## ...

  4. arguments及arguments.callee

    首先有一个JavaScript函数 function test(a, b, c, d) { return a + b; } 在JavaScript中调用一个函数的实参个数可以和被调用函数的形参个数不匹 ...

  5. Java Calendar.set 方法设置时间的问题

    因项目需要,需要遍历一年中的其中几个月,获得每个月的用户数量.  变量有:开始时间--startDate,结束时间--endDate. 逻辑很简单:获取到开始时间的月份和结束时间的月份,然后得到月份差 ...

  6. Tinychatserver: 一个简易的命令行群聊程序

    这是学习网络编程后写的一个练手的小程序,可以帮助复习socket,I/O复用,非阻塞I/O等知识点. 通过回顾写的过程中遇到的问题的形式记录程序的关键点,最后给出完整程序代码. 0. 功能 编写一个简 ...

  7. 用PHP ping 一个 IP

    最近要做一个 测试IP列表 是否能连通的功能.大家都知道我们一般用 ping 命令就可以看到IP端口可不可以连通.那在程序里要怎么做呢? 我们在网上找到很多都是使用  exec("ping ...

  8. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  9. Jmeter+Badboy实战经验三 Jmeter关联相关知识

    1. 什么时候需要使用关联? 有些参数是动态变化的,获取之后,再次操作的时候,参数的值已经发生了变化,这种情况下就会出现脚本不可运行的问题,就需要用到了关联 2. 关联是什么概念? 3.jmeter ...

  10. Vmware虚拟机设置静态IP地址

    一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子网掩码和网关,后面修改静态IP会用到. ...