zabbix进程通信
TCP/IP套接字
需要注意这几个名词:
服务器---客户端
(server---client)
服务器端---客户端
(提供服务的程序,等待客户端连接并处理请求---发起请求的程序,连接到服务器以请求服务)
#以下内容中对象主体为server
作为服务器端时,trapper进程提供该通信服务,trapper进程继承自主进程的zbx_socket_t结构体变量,这一个变量在进程的整个生命周期中存活
作为客户端时,poller进程提供该服务,每次通信创建一个临时的zbx_socket_t变量,通信结束后回收
#结束
作为服务器端的socket
服务器:trapper进程
客户端:listener进程
服务器端的sockect建立监听的过程:
socket()-----bind()-----listen()-----accept()(开始循环)
server主进程调用zbx_tcp_listen()[有blog] 建立监听,可以根据conf文件中的listenip,listenport创建一个或多个socket并且绑定到指定地址进行监听,监听的socket就存放在zbx_socket_t结构体的socket数组中(?)
值守化,子进程继承了主进程创建的socket
trapper进程循环调用zbx_tcp_accept(),从所有socket里选择连接请求并进行处理(?)
成功的socket记录在s->socket中
在选择连接请求时,使用了select()实现的多路复用(?)
作为客户端的socket
服务器:poller进程
poller进程调用zbx_tcp_connect()创建临时socket,使用完毕立即销毁
只在处理net.udp.service时使用UDP套接字,此时作为客户端
基于UNIX域套接字和Libevent
本质是一个UDS连接池(?),避免管理者和工作者进程重新连接,在任何时候都可以互发信息