Android Netd
2016-07-10 14:08
731 查看
https://izobs.gitbooks.io/android-framework-development-guide/content/network/android_network.html
Netd是Android的网络守护进程。NetD是个网络管家,封装了复杂的底层各种类型的网络(NAT,PLAN,PPP,SOFTAP,TECHER,ETHO,MDNS等),隔离了底层网络接口的差异,给Framework提供了统一调用接口,简化了网络的使用。NetD主要功能是:
第一、接收Framework的网络请求,处理请求,向Framework层反馈处理结果;
第二、监听网络事件(断开/连接/错误等),向Framework层上报。
NetD程序的大概逻辑: [Kernel] <--Network Event--> (NetD) <--Command--> [Framework]。事件和命令传送采用跨进程通信机制(SOCKET).
Netd的main函数主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下:NetlinkManager:接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的 NetworkManagementService。
CommandListener、DnsProxyListener、MDnsSDListener、FwmarkServer:分别创建名为netd、dnsproxyd、mdns、fwmarkServer的监听socket.
下面针对上面提到主要成员进行分析。
Netd是Android的网络守护进程。NetD是个网络管家,封装了复杂的底层各种类型的网络(NAT,PLAN,PPP,SOFTAP,TECHER,ETHO,MDNS等),隔离了底层网络接口的差异,给Framework提供了统一调用接口,简化了网络的使用。NetD主要功能是:
第一、接收Framework的网络请求,处理请求,向Framework层反馈处理结果;
第二、监听网络事件(断开/连接/错误等),向Framework层上报。
NetD程序的大概逻辑: [Kernel] <--Network Event--> (NetD) <--Command--> [Framework]。事件和命令传送采用跨进程通信机制(SOCKET).
Netd: /System/netd /system/core/libsysutils/src /system/core/include/sysutils Framework: /frameworks/base/services/java/com/android/server int main() { CommandListener *cl; NetlinkManager *nm; DnsProxyListener *dpl; MDnsSdListener *mdnsl; FwmarkServer* fwmarkServer; ALOGI("Netd 1.0 starting"); blockSigpipe(); //NetlinkManager是用于接收kernel中的uevent if (!(nm = NetlinkManager::Instance())) { ALOGE("Unable to create NetlinkManager"); exit(1); }; //接收来自Framework层NetworkManageService的命令 cl = new CommandListener(); nm->setBroadcaster((SocketListener *) cl); if (nm->start()) { ALOGE("Unable to start NetlinkManager (%s)", strerror(errno)); exit(1); } // Set local DNS mode, to prevent bionic from proxying // back to this service, recursively. //对接frameworklistener //GetAddrInfoCmd,和Bionic C库的getaddrinfo函数对应。 //GetHostByAddrCmd,和Bionic C库的gethostbyaddr函数对应。 setenv("ANDROID_DNS_MODE", "local", 1); dpl = new DnsProxyListener(CommandListener::sNetCtrl); if (dpl->startListener()) { ALOGE("Unable to start DnsProxyListener (%s)", strerror(errno)); exit(1); } //MDnsSd是Multicast DNS Service Discovery的简称,它和Apple公司的Bonjour技术有关 //Bonjour使得局域网中的系统和服务即使在没有网络管理员的情况下也很容易被找到。 //举一个简单的例子:在局域网中,如果要进行打印服务,必须先知道打印服务器的IP地址。 //此IP地址一般由IT部门的人负责分配,然后他还得全员发邮件以公示此地址。有了Bonjour以后, //打印服务器自己会依据零配置网络标准在局域网内部找到一个可用的IP并注册一个打印服务? //名为“print service”之类的。当客户端需要打印服务时,会先搜索网络内部的打印服务器。 //由于不知道打印服务器的IP地址,客户端只能根据诸如"print service"的名字去查找打印机 mdnsl = new MDnsSdListener(); if (mdnsl->startListener()) { ALOGE("Unable to start MDnsSdListener (%s)", strerror(errno)); exit(1); } //创建 FwmarkServer并启动监听,它将创建名为fwmarkd的监听 fwmarkServer = new FwmarkServer(CommandListener::sNetCtrl); if (fwmarkServer->startListener()) { ALOGE("Unable to start FwmarkServer (%s)", strerror(errno)); exit(1); } /* * Now that we're up, we can respond to commands */ if (cl->startListener()) { ALOGE("Unable to start CommandListener (%s)", strerror(errno)); exit(1); } // Eventually we'll become the monitoring thread while(1) { sleep(1000); } ALOGI("Netd exiting"); exit(0); }
Netd的main函数主要是创建几个重要成员并启动相应的工作,这四个重要成员分别如下:NetlinkManager:接收并处理来自Kernel的UEvent消息。这些消息经NetlinkManager解析后将借助它的Broadcaster(也就是代码中为NetlinkManager设置的CommandListener)发送给Framework层的 NetworkManagementService。
CommandListener、DnsProxyListener、MDnsSDListener、FwmarkServer:分别创建名为netd、dnsproxyd、mdns、fwmarkServer的监听socket.
下面针对上面提到主要成员进行分析。
相关文章推荐
- android toolbar收缩的实现{局限性非常强}
- EventBus
- Android之Pull解析XML文件
- Android中关于系统Intent的一些应用的说明
- Imooc---Android工程师
- Android 关于android:foreground设置无效的问题
- Android Bander设计与实现 - 设计篇
- 从零开始开发一个Android项目的一般步骤
- Cordova自定义插件实战
- Android开发之Error when loading the SDK
- 自定义控件(二) 一个圆形钟表
- ADT发生异常错误笔记
- Android AES DES RSA 加密解密 解析
- Android学习笔记:使用xml和java代码垂直显示4张图片
- Could not find class 'android.support.v4.widget.EdgeEffectCompat',
- android 笔记之Spinner控件的实现
- [直播一揽子]x264 for Android 的编译
- Android直播推流学习
- Android事件分发机制
- 安卓手册 第五章(开发之TextView)