hredis 发布订阅 二进制数据

            //publish发送到redis服务器
            const char *v[3];
            size_t vlen[3];
            
            v[0] = "PUBLISH";
            vlen[0] = strlen("PUBLISH");
            
            v[1] = t->publish_channel;
            vlen[1] = strlen(t->publish_channel);

            v[2] = (const char *)(t->address);
            vlen[2] = t->len;
            
            //执行发布指令
            redisReply* reply = (redisReply*)redisCommandArgv(t->contex, sizeof(v)/sizeof(v[0]), v, vlen);
            if (!reply) {
		        printf("empty reply\n");		        
	        }

以上为发布。

#include "2_subscribe_client.h"

redis_client_subscribe_t *t2;

//打印收到数据的16进制,测试用
void printHex(const char* str) {
    for(int i = 0; i < 50; i++) {
        printf("%02x ", (unsigned char)str[i]);
    }
}

//接收数据的回调函数
void getCallback(redisAsyncContext *c, void *r, void *privdata) {
    redisReply *reply = (redisReply *)r;
    if (reply == NULL) 
        return;

    printf("Data received: ");
    for (int i = 0; i < reply->len; i++) {
        printf("%02x ", reply->str[i]);
    }
    printf("\n");

    if (reply->type == REDIS_REPLY_ARRAY && reply->elements == 3) {
        if (strcmp(reply->element[0]->str, "subscribe") != 0) {
            // printf("Received[%s] channel %s: %s\n",
            //        (char *)privdata,
            //        reply->element[1]->str,
            //        reply->element[2]->str);
            // printf("Received %d: %.*s\n", (int)reply->element[2]->len, (int)reply->element[2]->len, reply->element[2]->str);
            // printHex(reply->element[2]->str);
            //写入共享内存
            memcpy(t2->address, reply->element[2]->str, (int)reply->element[2]->len);
        }
    }
}

//连接回调函数
void connectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Connected...\n");
}
//断开连接回调函数
void disconnectCallback(const redisAsyncContext *c, int status) {
    if (status != REDIS_OK) {
        printf("Error: %s\n", c->errstr);
        return;
    }
    printf("Disconnected...\n");
}

void redis_client_subscribe(redis_client_subscribe_t *t)
{
    t2 = t;
      
    redisLibevAttach(EV_DEFAULT_ (t->contex) );
    redisAsyncSetConnectCallback(t->contex,connectCallback);
    redisAsyncSetDisconnectCallback(t->contex,disconnectCallback);
    
    const char *v[2];
    size_t vlen[2];
    
    v[0] = "SUBSCRIBE";
    vlen[0] = strlen("SUBSCRIBE");
    
    v[1] = t->subscribe_channel;
    vlen[1] = strlen(t->subscribe_channel);
    
    //执行订阅指令
    redisAsyncCommandArgv(t->contex, getCallback, NULL,2, v, vlen);

    ev_loop(EV_DEFAULT_ 0);
}

以上为订阅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值