打印

【原创】基于简单的内存数据库实现一个异步回调的通信...

[复制链接]
1132|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2020-4-14 10:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 keer_zu 于 2020-4-17 16:54 编辑

前面实现了一个简单的内存数据库,接下来就基于这个简单的内存数据库实现一个异步回调的通信框架。

zxcom


@紫剑

@dirtwillfly @海中水
@icecut @yyy71cj


参看之前帖子:


【原创】一个超简单的key-value内存数据库



库的使用实例:
main.c

#include <sys/types.h>
#include <unistd.h>
#include "ucomlib.h"
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include "zxcom.h"
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <stdlib.h>
pthread_mutex_t g_mutex;

int server_fd = -1;
int client_fd = -1;


char * server_filename = "/tmp/socket-server";
char * client_filename = "/tmp/socket-client";

void ENTER_CRITICAL()
{
        pthread_mutex_lock(&g_mutex);
}


void EXIT_CRITICAL()
{
        pthread_mutex_unlock(&g_mutex);
}

int CRITICAL_INIT()
{
        pthread_mutex_init(&g_mutex, NULL);
}

int CRITICAL_DEINIT()
{
        pthread_mutex_destroy(&g_mutex);
}

void *thread_timer(void* arg)
{
        //printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
        while(1) {
                sleep(2);
                OnTimer();
        }
}

struct sockaddr_un srv_un_s = {0};
struct sockaddr_un srv_un_c = {0};


void *thread_run_c(void* arg)
{
        int ret;
        char packet[100],buf[100];
        socklen_t addre_len;
        int socketfd = *(int *)arg;
        char *param = "hello";
        //struct sockaddr_un srv_un = {0};        
        struct sockaddr_un remote_un = {0};        

        while (1) {
                sleep(2);
                ZxcomOnSendMsg(1,param,strlen(param),packet);
                if (sendto(socketfd,packet,strlen(param) + 4, 0,
                        (struct sockaddr *)&srv_un_s, sizeof(srv_un_s)) == -1) {
                        perror("send");
                        close(socketfd);
                        socketfd = -1;
                        pthread_exit(NULL);
                }

                memset(buf, 0, sizeof(buf));
                ret = recvfrom(socketfd, buf, sizeof(buf), 0,
                        (struct sockaddr*)&remote_un, &addre_len);
                if (ret == -1) {
                        perror("error when recvfrom, ");
                        continue;
                        
                }
                ZxcomOnPacket(buf,ret);

                buf[ret] = 0;
                printf("cli ret:%d, contrl:0x%x    %s\n", ret,*(int*)buf,buf+4);
        }
}



void *thread_run_s(void* arg)
{
        int ret;
        int i =0;
        socklen_t addre_len;
        struct sockaddr_un remote_un = {0};        
        char buf[100] = {0};
        int server_fd = *(int *)arg;
        for(;;) {
                ++i;
                memset(buf, 0, sizeof(buf));
                ret = recvfrom(server_fd, buf, sizeof(buf), 0,
                        (struct sockaddr*)&remote_un, &addre_len);
                if (ret == -1) {
                        perror("error when recvfrom, ");
                        continue;
                        
                }
                ZxcomOnPacket(buf,ret);

                buf[ret] = 0;
                printf("ret:%d, contrl:0x%x    %s\n", ret,*(int*)buf,buf+4);
                usleep(500000);
        }   

        //close(server_fd);
        //server_fd = -1;
}





int cmd1_handler(void *param)   //server
{
        printf("handler param: %s\n",(char*)param);
        //struct sockaddr_un srv_un = {0};
        char *res = "go away";
        char packet[100];
        ZxcomOnSendResponse(1,res, strlen(res), packet);

        if(server_fd < 0) {
                return -1;
        }

        if (sendto(server_fd,packet,strlen(res) + 4, 0,
                        (struct sockaddr *)&srv_un_c, sizeof(srv_un_c)) == -1) {
                        perror("send");
                        close(server_fd);
                        server_fd = -1;
                        pthread_exit(NULL);
        }
}


int response1_handler(void *param)
{
        printf("response handler param: %s\n",(char*)param);
}


int main(int argc, char **argv)
{
        int ret;
        
        pthread_t tid_timer,tid_run1,tid_run2;

        char obuf[100];
        //struct sockaddr_un srv_un_c = { 0 };
        

        
        ZxcomInit();
        ZxcomAddCommand(1,cmd1_handler);
        ZxcomAddResponse(1,response1_handler);

        srv_un_c.sun_family = AF_UNIX;
        strncpy(srv_un_c.sun_path, client_filename, sizeof(srv_un_c.sun_path));

        srv_un_s.sun_family = AF_UNIX;
        strncpy(srv_un_s.sun_path, server_filename, sizeof(srv_un_s.sun_path));

        

        
        

        char mode = 's';
        if (argc > 1)
                mode = argv[1][0];
        if (mode == 's'){
                server_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
                if (server_fd < 0) {
                        printf("socket error %s errno: %d\n", strerror(errno), errno);
                }
        
                unlink(srv_un_s.sun_path);

                if (bind(server_fd, (struct sockaddr *)&srv_un_s, sizeof(srv_un_s)) == -1) {
                        printf("bind server err");
                        exit(1);
                }

                pthread_create(&tid_run2,NULL,thread_run_s,&server_fd);
        } else {
                client_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
                if (client_fd < 0) {
                        printf("socket error %s errno: %d\n", strerror(errno), errno);
                }
                unlink(srv_un_c.sun_path);
               
                if (bind(client_fd, (struct sockaddr *)&srv_un_c, sizeof(srv_un_c)) == -1) {
                        perror("bind client");
                        exit(1);
                }
               
                pthread_create(&tid_run1,NULL,thread_run_c,&client_fd);
        }

        pthread_create(&tid_timer,NULL,thread_timer,NULL);

        while(1){
                sleep(10);
        }
        
        return 0;
}



debug已经完成,可以直接从github上拉去代码,编译,运行在linux上面。  

@dirtwillfly @icecut @yyy71cj

在linux下:

git clone https://github.com/KevinZu/zxcom.git

cd zxcom

checkout -b develop

git pull origin develop

mkdir build

cd build

cmake ..

make



然后执行服务端:

./main


再执行客户端:
./main c

服务端:





客户端:


  

使用特权

评论回复

相关帖子

沙发
icecut| | 2020-4-14 17:22 | 只看该作者
哈哈哈。浓浓的互联网味道。 用邮箱不能实现么?或者消息队列?

使用特权

评论回复
板凳
keer_zu|  楼主 | 2020-4-14 17:38 | 只看该作者
icecut 发表于 2020-4-14 17:22
哈哈哈。浓浓的互联网味道。 用邮箱不能实现么?或者消息队列?

要mcu也能用才行。

使用特权

评论回复
评论
keer_zu 2020-4-16 10:31 回复TA
@dirtwillfly 可以直接从github上拉去代码,编译,运行在linux上面。 
地板
keer_zu|  楼主 | 2020-4-15 10:23 | 只看该作者
yyy71cj 发表于 2020-4-15 10:05
我想请教一个问题:给安卓手机编程,你用什么编程环境和工具?我正想转战手机编程,但是一直在选择用什么而 ...

你要做哪一层开发?
内核也是linux,开发当然用C语言。


如果做APP,那就是java,java我之前用eclipse或者myeclipse。

java是跨平台的,不必过多考虑平台的差异。

使用特权

评论回复
5
icecut| | 2020-4-16 10:04 | 只看该作者
keer_zu 发表于 2020-4-14 17:38
要mcu也能用才行。

ucos里面有吧

使用特权

评论回复
6
keer_zu|  楼主 | 2020-4-16 10:19 | 只看该作者

ucos不管通信吧

使用特权

评论回复
7
keer_zu|  楼主 | 2020-4-19 13:24 | 只看该作者
yyy71cj 发表于 2020-4-18 12:08
有没有类似VS这种的工具软件?

eclipse就是类似VS啊,用的人挺多的。

使用特权

评论回复
8
keer_zu|  楼主 | 2020-4-20 09:57 | 只看该作者
yyy71cj 发表于 2020-4-19 20:17
我试试。记得以前装过,需要配置不少东西,蛮繁琐的。

像eclipse,sublime这样的工具通常支持很多语言,针对特定语言和功能需要安装若干插件,通常安装很方便。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1352

主题

12436

帖子

53

粉丝