AndroidT(13) Log 系统 -- SocketListener 帮助类详解(六)

本文解析了SocketListener的工作原理,包括初始化、启动监听、处理客户端连接请求等过程,并详细介绍了其核心方法runListener的具体实现。

1. 概览

   因为 logd 中使用 socket 技术,logd 和 client 之间的通信使用的就是socket。所以例如 logdr/klogd的实现类都会涉及到socket的监听。本章 SocketListener 就是对这一部分可共用的功能的一个提炼。实际上它属于库 libsysutils,并不是仅仅使用在logd中。只要有socket监听需求的程序都可以使用它。

2. SocketListener 初始化

  SocketListener 提供了多个构造方法,

//code 1
SocketListener::SocketListener(const char *socketName, bool listen) {
   
   
    init(socketName, -1, listen, false);
}
//code 2
SocketListener::SocketListener(int socketFd, bool listen) {
   
   
    init(nullptr, socketFd, listen, false);
}
//code 3
SocketListener::SocketListener(const char *socketName, bool listen, bool useCmdNum) {
   
   
    init(socketName, -1, listen, useCmdNum);
}

  listen 的值决定当前 socket 是否支持建立新的 socket 链接,例如

SocketListener("/dev/socket/flagstaff", true)

    上面意味着对于 flagstaff 是支持作为服务端的,并且它是支持接收客户端发送过来的连接请求的,在建立连接后新的socket也是受 SocketListener 监听的。反之,这个 SocketListener 就只支持监听传入的这个 flagstaff 句柄了,当然此时的句柄就不能是socket了,一般是个普通文件句柄。
  从上面 SocketListener 的几个构造方法实现可知,最终都是调用 init 方法进行处理的。init 的实现也是非常的简单,只是对各个入参进行记录。

void SocketListener::init(const char *socketName, int socketFd, bool listen, bool useCmdNum) {
   
   
    mListen = listen;
    mSocketName = socketName;
    mSock = socketFd;
    mUseCmdNum = useCmdNum;
}

3. SocketListener 启动

  SocketListener 的使用非常的简单,只需要提供 socket 的 fd 或者绝对路径即可。在服务端准备接收来自所监听socket的的信息后后,即可调用 startListener 接口来启动监听。

//system\core\libsysutils\src\SocketListener.cpp
int SocketListener::startListener
    return startListener(4)
        //code 1
        if (mSocketName)
            mSock = android_get_control_socket(mSocketName)
        //code 2
        if (mListen && listen(mSock, backlog)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值