ipcweb和rkipc之间的通信是通过本地套接字进行的,其中,ipcweb为client端,rkipc为server端
client端(ipcweb)
在ipcweb/ipcweb/backend/src/socket_client/socket.cpp中
int cli_begin(char *name) {
int fd;
int len = 0;
//连接rkipc的套接字
//#define CS_PATH "/var/tmp/rkipc"
fd = cli_connect(CS_PATH);
if (fd < 0)
return fd;
len = strlen(name) + 1;
sock_write(fd, (char *)&len, sizeof(int));
sock_write(fd, name, len);
return fd;
}
int cli_connect(const char *name) {
int ret;
int fd, len;
struct sockaddr_un unix_addr;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
exit(0);
memset(&unix_addr, 0, sizeof(unix_addr));
unix_addr.sun_family = AF_UNIX;
strcpy(unix_addr.sun_path, name);
len = sizeof(unix_addr.sun_family) + strlen(unix_addr.sun_path);
if (connect(fd, (struct sockaddr *)&unix_addr, len) < 0)
goto error;
if (sock_read(fd, &ret, sizeof(int)) == SOCKERR_CLOSED)
return -1;
return (fd);
error:
printf("%s err\n", __func__);
close(fd);
return (-1);
}
client端通过套接字,打开 /var/tmp/rkipc 服务,进行通信
server端(rkipc)
在luckfox-pico/project/app/rkipc/rkipc/common/socket_server/server.c中
static void *rkipc_server_thread(void *arg) {
int clifd;
LOG_INFO("#Start %s thread, arg:%p\n", __func__, arg);
prctl(PR_SET_NAME, "rkipc_server_thread", 0, 0, 0);
pthread_detach(pthread_self());
//#define CS_PATH "/var/tmp/rkipc"
if ((listen_fd = serv_listen(CS_PATH)) < 0)
LOG_ERROR("listen fail\n");
while (RkIpcServerRun) {
pthread_t thread_id;
if ((clifd = serv_accept(listen_fd)) < 0) {
LOG_ERROR("accept fail\n");
}
if (clifd >= 0)
pthread_create(&thread_id, NULL, rec_thread, (void *)(intptr_t)clifd);
}
RkIpcServerTid = 0;
pthread_exit(NULL);
return 0;
}
server端监听/var/tmp/rkipc,一旦有连接,则创建线程
static void *rec_thread(void *arg) {
int fd = (int)(intptr_t)arg;
char *name = NULL;
int len;
int ret = 0;
int i;
int maplen = sizeof(map) / sizeof(struct FunMap);
pthread_detach(pthread_self());
if (sock_write(fd, &ret, sizeof(int)) == SOCKERR_CLOSED) {
ret = -1;
goto out;
}
again:
if (sock_read(fd, &len, sizeof(int)) == SOCKERR_CLOSED) {
ret = -1;
goto out;
}
if (len <= 0) {
ret = -1;
goto out;
}
name = (char *)malloc(len);
if (sock_read(fd, name, len) == SOCKERR_CLOSED) {
ret = -1;
goto out;
}
for (i = 0; i < maplen; i++) {
// printf("%s, %s\n", map[i].fun_name, name);
if (!strcmp(map[i].fun_name, name)) {
ret = map[i].fun(fd);
}
}
out:
if (name)
free(name);
name = NULL;
if (ret == 0) {
sock_write(fd, &ret, sizeof(int));
goto again;
}
close(fd);
pthread_exit(NULL);
return 0;
}
数据通信
在建立连接以后
// c----->s,发送命令长度len
len = strlen(name) + 1;
sock_write(fd, (char *)&len, sizeof(int));
//s收到数据进行判断,给name分配内存
if (sock_read(fd, &len, sizeof(int)) == SOCKERR_CLOSED) {
ret = -1;
goto out;
}
if (len <= 0) {
ret = -1;
goto out;
}
name = (char *)malloc(len);
//c----->s,发送命令
sock_write(fd, name, len);
//s收到命令
if (sock_read(fd, name, len) == SOCKERR_CLOSED) {
ret = -1;
goto out;
}
for (i = 0; i < maplen; i++) {
// printf("%s, %s\n", map[i].fun_name, name);
if (!strcmp(map[i].fun_name, name)) {
//执行命令
ret = map[i].fun(fd);
}
}
server端的命令执行
static const struct FunMap map[] = {
{(char *)"rk_isp_set", &ser_rk_isp_set},
如果map中的命令比对上了,则执行函数
例如,命令是rk_isp_set,执行ser_rk_isp_set(fd)函数
int ser_rk_isp_set(int fd) {
int len;
char *json = NULL;
if (sock_read(fd, &len, sizeof(int)) == SOCKERR_CLOSED)
return -1;
if (len) {
json = (char *)malloc(len);
if (sock_read(fd, json, len) == SOCKERR_CLOSED) {
free(json);
return -1;
}
LOG_DEBUG("isp json is %s\n", json);
free(json);
}
return 0;
}
这个函数只是显示了log了一下收到的命令