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)

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

被折叠的 条评论
为什么被折叠?



