iptables 完成联网控制 (续) ,独立native进程监听。

  上一篇:http://www.cnblogs.com/oscar1011/p/5243877.html

  之前做的iptables 来进行的联网控制,一直耿耿于怀,想要知道系统里的netd等等是如何做到执行那些命令,并能监听的。

  最近有机会又对这部分进行了一些研究。

  所要做的大概就是3部分,1. native进程,这部分得用c/c++来写,

               2. framework接口。用于和native进程通信。

               3. selinux权限配置,主要就是为了赋予natvie进程

             

  framework与native的通信这部分也是一个很有趣的地方,看了系统源码,很多模块使用了local socket进行上下层的通信。 好处就是稳定性高,而且另一点应该就是易封装,独立开来。

  1.下面就来稍作介绍native 进程的部分,

native的主要作用就是接收命令和执行命令,接收framework传输的命令,执行相应的shell 命令。

    此处有两个现成的类可供使用,FrameworkCommand 类,用于注册cmd,大概就是用于转发命令用的吧。

    另一个是 FrameworkListener, 用于注册socket监听, 该类new的时候需要传入一个string,监听对应名称的socket。 上层也需要使用该socket进行通信。该socket要和后面framework中使用的相对应。

    以下为代码部分

 1 #include <stdio.h>
 2 #incldue <stdlib.h>
 3 #define LOG_TAG "TEST"
 4
 5 #include "CommandListener.h"
 6
 7 int main(){
 8
 9     CommandListener *cl;
10     cl = new CommandListener();
11     cl->startListener();     //开始监听
12     while(1){
13         sleep(10);              //循环,防止进程退出
14         ALOGE("sleep 10s ");
15     }
16
17     return 0;
18 }

main.cpp

 1 #include "CommandListener.h"
 2
 3
 4 CommandListener::CommandListener()
 5         : FrameworkListener("test",true) {
 6     registerCmd(new FirstTestCmd());  //注册对Test
 7 }
 8
 9 CommandListener::~CommandListener(){
10 }
11
12 //此处的firsttest后面通信会用到
13 CommandListener::FirstTestCmd::FirstTestCmd()
14         : TestCommand("firsttest")
15 { }
16
17 int CommandListener::FirstTestCmd::runCommand(SocketClient *cli,
18                                          int argc, char **argv) {
19     ALOGE("Test  %d",  argc );
20     //对输入的参数进行处理
21      cli->sendMsg("1");     //根据情况返回相应的信息
22     return 0;
23 }

CommandListener.cpp

1 #include "TestCommand.h"
2
3 TestCommand::TestCommand(const char *cmd) :
4               FrameworkCommand(cmd)  {
5 }

TestCommand.cpp

  

  2.framework接口部分

    这部分比较简单,只需要在service中创建一个线程,获取到socket,并提供开放接口供app调用即可。 获取socket输出流代码如下:

1 LocalSocket socket = new LocalSocket();
2 OutputStream os = null;
3 LocalSocketAddress lsa = new LocalSocketAddress("test", LocalSocketAddress.Namespace.RESERVED);
4
5 socket.connect(lsa);
6 os = socket.getOutputStream();
7 os.write("5 firsttest abc  cdf\0".getBytes(StandardCharsets.UTF_8));

  而向这个流写入东西的时候也是有格式限制的,必须是【数字+空格+注册的CMD+空格+内容】的结构。因为当native收到数据时会需要返回一个数据,如果没有这个【数字】进行编号,很可能会导致信息的前后不对应。数据的返回监听一般是建立一个线程单独进行监听。

3.selinux 权限

    这块说实话,研究了好几天,感觉有些地方还是很难理解。这些权限的设置会直接影响到native 进程的功能。 而且权限有很多,必须得针对需要的权限进行研究添加,修改的目录一般就两个地方,external/sepolicy和device下面对应开发商的一个配置路径。

        至少得加3个地方, 声明native进程的类型,因为用到了socket,还得将socket声明出来,毕竟linux下万物归为文件。还有一个是对test进程的权限声明,这里就不写出来了,毕竟自己都不是很懂,省的误导人。需要用的小伙伴可以自行研究

  

/dev/socket/test    u:object_r:test_socket:s0
/system/bin/test    u:object_r:test_exec:s0

sepolicy/file_contexts

1 type test_socket, file_type;

sepolicy/file.te

时间: 2024-10-12 15:58:24

iptables 完成联网控制 (续) ,独立native进程监听。的相关文章

[技术博客]react native事件监听、与原生通信——实现对通知消息的响应

在react native中会涉及到很多页面之间的参数传递问题.静态的参数传递通常利用组件的Props属性,在初始化组件时即可从父组件中将参数传递到子组件中.对于非父子关系的组件来说,无法直接传递参数,此时可能会用到react-navigation来传递:此外,若要将异步函数.不可预料的事件执行等得到的参数用于页面刷新时,前述的方法都不太奏效. DeviceEventEmitter react-native中采用了DeviceEventEmitter来实现对事件的监听,实现非父子关系的页面之间的

【C/C++】多进程:父进程监听子进程状态 wait()的使用

文章结构: wait能力介绍 wait()函数讲解 示例代码及操作演示 wait能力介绍 在上一篇[C/C++]多进程:子进程的创建fork()中演示了子进程的创建. 创建子进程后,父进程具有监听子进程的运行状态的能力,用到的函数为: #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); 以上函数用于等待子进程子进程的状态变化回调并且获取状态变化信息.

Yii2.0 安装yii2-queue并在Linux启动守护进程监听消息

一.什么是yii2-queue? Yii2-queue是Yii2.0 PHP框架下一个消息队列拓展插件,支持基于DB, Redis, RabbitMQ, AMQP, Beanstalk 和 Gearman等.yii2-queue GitHub地址:https://github.com/yiisoft/yii2-queue 二.如何安装yii2-queue? php composer.phar require --prefer-dist yiisoft/yii2-queue 三.Linux sys

linux系统实现多个进程监听同一个端口

通过 fork 创建子进程的方式可以实现,其他情况下不行. 当连接到来时,子进程.父进程都可以 accept, 这就是著名的"惊群"问题(thundering herd problem). 惊群现象 在该模型下(多个子进程同时共享监听套接字)即可实现服务器并发处理客户端的连接.这里要注意的是,计算机三次握手创建连接是在内核进程里完成的,不需要应用服务进程参数的,而服务进程仅仅要做的是调用accept将已建立的连接构建对应的连接套接字connfd(可参考 http://blog.csdn

linux下的 进程控制 以及常见的进程控制函数

进程控制: 1. 进程创建函数: fork(); 头文件: #include<sys/types.h> #include<unistd.h> 函数原型: pid_t fork(void); 函数返回值:0:表示此进程现在是子进程: -1:表示出错: 子进程ID号:(大于零的整数):表示现在此进程时父进程,接收到的ID号是子进程的ID号: 2.fork()返回-1(也就是进程创建出错的原因) 1.系统中拥有了太多的进程:超过了系统的限制:(系统级) 2.该用户有了太多的进程,超过了C

Python之路【第七篇续】:进程、线程、协程

Socket Server模块 SocketServer内部使用 IO多路复用 以及 "多线程" 和 "多进程" ,从而实现并发处理多个客户端请求的Socket服务端.即:每个客户端请求连接到服务器时,Socket服务端都会在服务器是创建一个"线程"或者"进 程" 专门负责处理当前客户端的所有请求. socket server 和 select & epoll 还是不太一样他的本质是:客户端第一次链接的时候,只要一进来

C++ Primer 学习笔记_68_面向对象编程 --构造函数和复制控制[续]

面向对象编程 --构造函数和复制控制[续] 三.复制控制和继承 合成操作对对象的基类部分连同派生类部分的成员一起进行复制.赋值或撤销,使用基类的复制构造函数.赋值操作符或析构函数对基类部分进行复制.赋值或撤销. 类是否需要定义复制控制成员完全取决于类自身的直接成员.基类可以定义自己的复制控制而派生类使用合成版本,反之,基类使用合成版本,而派生类使用自己定义的复制控制也可以. 只包含类类型或内置类型的数据成员.不包含指针的类一般可以使用合成操作,复制.赋值或撤销这样的成员不需要使用特殊控制.但是:

C++ Primer 学习笔记_68_面向对象编程 -构造函数跟复制控制[续]

面向对象编程 --构造函数和复制控制[续] 三.复制控制和继承 合成操作对对象的基类部分连同派生类部分的成员一起进行复制.赋值或撤销,使用基类的复制构造函数.赋值操作符或析构函数对基类部分进行复制.赋值或撤销. 类是否需要定义复制控制成员完全取决于类自身的直接成员.基类可以定义自己的复制控制而派生类使用合成版本,反之,基类使用合成版本,而派生类使用自己定义的复制控制也可以. 只包含类类型或内置类型的数据成员.不包含指针的类一般可以使用合成操作,复制.赋值或撤销这样的成员不需要使用特殊控制.但是:

查看监听端口号,以及关闭进程

查看本机的监听端口号 netstat -an 回车 此命令可以查看本机已经启动的监听端口 -------------------------------------------------------------------------------------------------- 在windows命令行窗口下执行:   C:\>netstat -ano 我们可以知道某一端口被那个进程(对应PID)占用:然后我们可以打开任务管理器:查看某一PID对应的进程名:如果PID没有显示,菜单>查看