#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
服务端启动
int wiCallCtrlServerInit(const char *server_socket_file) // #define SERVER_SOCKET_FILE "/tmp/cfg_server.sock"
1. 建立进程通信的服务端套接字
fd = socket(PF_UNIX, SOCK_DGRAM, 0) // 域PF_UNIX用于管道和文件,类型,协议0为自动
2. 将套接字和服务端文件进行绑定
// struct sockaddr_un addr; 把地址初始化后,赋值,地址类型,地址为server_socket_file
bind(fd, &addr, sizeof(addr)) // 先 unlink(server_socket_file);再绑定
3. 启动一个线程处理通信,返回服务端的套接字
pthread_create(&id, NULL, (void *)*domain_socket_thread, (void *)fd); // 启动服务器线程
return fd;
服务端的处理:
void *domain_socket_thread(void *arg)
while // 服务器无限循环,每隔1秒,用select去查读 文件描述符 里,是否 这个服务器fd 准备就绪
iRet = select(FD_SETSIZE, reads_fd, (fd_set *)NULL, (fd_set *)NULL, &timeout)
if(FD_ISSET(server_fd, reads_fd))
// 先接受 消息头
serverRecvFrom(server_fd, &msg_head, sizeof(msg_head), MSG_PEEK, &from, sizeof(from))
// 根据消息类型 进行分流处理
switch(msg_head.id)
case XXX:
// 处理接收的 消息体 call recvfrom
serverRecvFrom(server_fd, &msg_1, sizeof(msg_1), MSG_PEEK, &from, sizeof(from))
// 发送回应消息 call sendto
serverSendTo(server_fd,&msg_res,sizeof(msg_res),0,&from, from_len);
服务器端关闭:
int wiCallCtrlServerUninit(int *server_fd_ptr)
close(*server_fd_ptr);
remove(SERVER_SOCKET_FILE);
-----------------------------------------------------------------------------------------------------------------
client客户端启动
int wiCallCtrlClientInit()
1. 建立客户端通信套接字
2. 将1中的套接字 同 客户端文件 绑定
// rand随机找一个文件, access测试文件存在
sprintf(socket_info->client_socket_file, "/tmp/cfg_client_%d.sock", rand_num);
3. 循环连接服务器,用 客户端fd + 服务端的地址 usleep
connect(client_fd, &ServAddr, sizeof(ServAddr))
client发送请求
int wiCallCtrlKeyEvent(int handle, unsigned short key_id, unsigned short key_help_id)
1. 填写msg后发送 call send
rc = wiCallCtrlClientSend(client_fd, &msg, sizeof(msg), 0);
2. 处理服务器响应消息 call recv
用select等待响应消息 ret = 0 超时, -1 错误, 大于0 ok // no need while
wiCallCtrlClientRecv(client_fd,(key_event_t*)msg_res, sizeof(key_event_t), 0);
client关闭
删文件,close fd
------------------------------------------------------------------------------------------------------------
A,B两个模块进行通信,A作为服务端
A模块 == (主处理进程 + 服务端代码 + 客户端代码)
1. A模块在启动时,初始化服务端,并启动一个线程,循环处理客户端的请求
call wiCallCtrlServerInit
2. A模块的客户端代码,编译成.so。 并提供.h .so 给B模块。
B模块 == (主处理 + A的客户端动态库)
1. B模块在启动时,同时启动A的客户端
call wiCallCtrlClientInit
(A进程 + A_server线程) <-----socket----> (A_client + B进程)