Netd和framework层的通信,主要解释socket

本文详细介绍了Netd与framework层如何通过Unix Domain Socket进行通信。在系统初始化时,从init.rc创建名为netd的socket。Netd在启动过程中创建并发布socket,而framework通过特定的环境变量获取socket连接。Netd内部的CommandListener和相关监听器类实现了与framework的交互。
摘要由CSDN通过智能技术生成

Netd和framework层的通信

这两者的通信时通过unix domain socket来完成的。

系统初始化的时候会从init.rc里面读取并创建socket,名字叫netd

service netd /system/bin/netd

    class main

    socket netd stream 0660 root system

    socket dnsproxyd stream 0660 root inet

    socket mdns stream 0660 root system

 

1.      先来看一下socket的创建过程

手机开机的时候执行init.c的main函数

int main(int argc, char **argv)

{

………

restorecon("/dev");

restorecon("/dev/socket");//创建的socket文件在这个目录下

……...

init_parse_config_file("/init.rc");

………

}

init_parse_config_file调用init_parse.c的parse_config函数里处理init.rc的数据。

Socket的处理是在parse_line_service里面,保存socketinfo到一个链表里面

static void parse_line_service(struct parse_state *state, int nargs, char **args)

{

case K_socket: {/* name type perm [ uid gid ] */

        struct socketinfo *si;

        if (nargs < 4) {

parse_error(state, "socket option requires name, type, perm arguments\n");

            break;

        }

        if (strcmp(args[2],"dgram") && strcmp(args[2],"stream")

                && strcmp(args[2],"seqpacket")) {

parse_error(state, "socket type must be 'dgram', 'stream' or 'seqpacket'\n");

            break;

        }

        si = calloc(1, sizeof(*si));

        if (!si) {

            parse_error(state, "out of memory\n");

            break;

        }

        si->name = args[1];

        si->type = args[2];

        si->perm = strtoul(args[3], 0, 8);

        if (nargs > 4)

            si->uid = decode_uid(args[4]);//userID

        if (nargs > 5)

            si->gid = decode_uid(args[5]);//groupID

        si->next = svc->sockets;

        svc->sockets = si;

        break;

    }

Socket真正的创建过程是在启动service的时候,即调用函数service_start的时候

void service_start(struct service *svc, const char *dynamic_args)

{

……….

        for (si = svc->sockets; si; si = si->next) {

int socket_type = (!strcmp(si->type, "stream") ? SOCK_STREAM : (!strcmp(si->type, "dgram") ? SOCK_DGRAM : SOCK_SEQPACKET));

            int s = create_socket(si->name, socket_type,

                                  si->perm, si->uid, si->gid);

            if (s >= 0) {

                publish_socket(si->name, s);

            }

        }

…………

}

这里做了两个操作,create_socket是创建socket

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值