//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);
}
以上为订阅。