c++ - Redis pub/sub 序列化数据 struct C 数据

标签 c++ c redis hiredis

我想将我的序列化数据存储在 redis 上并发布到我定义的 channel 。但是在redis setting key value 好像有问题。我想念什么解决方案?

提前致谢。

#include <stdio.h>
#include <assert.h>
#include <signal.h>
#include <stdlib.h>
#include "hiredis.h"
#include "async.h"
#include "macosx.h"


#define PACKETSIZE sizeof(cloudRANMessage)
#define COMMANDSIZE 256

typedef struct cloudRANMessage
{
unsigned int      station_id;
unsigned int      location_area;
char              command[COMMANDSIZE];
}cloudRANMessage;


void printMyMessage(cloudRANMessage *message)
{
printf("%d\n", message->location_area);
printf("%d\n", message->station_id);
printf("%s\n", message->command);
}

void serialize(cloudRANMessage *message, char *data)
{
assert(data != NULL);
memcpy(data, message, sizeof *message);
}

void deserialize(char *data)
{
cloudRANMessage *tempMessage = malloc(sizeof(cloudRANMessage));  // To store deserialized message.
memset(tempMessage, 0, sizeof(cloudRANMessage));
memcpy(tempMessage, data, sizeof(cloudRANMessage));
printMyMessage(tempMessage);
}

void getCallback(redisAsyncContext *c, void *r, void *privdata) {
redisReply *reply = r;
if (reply == NULL) return;
printf("%s\n", reply->str);                   // Call deserializaton function for the data retrieval.;
/* Disconnect after receiving the reply to GET */
redisAsyncDisconnect(c);
}

void callbackDeserialize(redisAsyncContext *c, void *r, void *privdata) {
redisReply *reply = r;
if (reply == NULL) return;
printf("%s\n", reply->str);                   // Call deserializaton function for the data retrieval.
char *stringReply = reply->element[0]->str;
deserialize(stringReply);
/* Disconnect after receiving the reply to GET */
redisAsyncDisconnect(c);
}

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;
}
CFRunLoopStop(CFRunLoopGetCurrent());
printf("Disconnected...\n");

}

int main (int argc, char **argv) {

cloudRANMessage *newcloudRANMessage = malloc(sizeof(cloudRANMessage));
newcloudRANMessage->location_area = 7214;
newcloudRANMessage->station_id = 45632;
strcpy(newcloudRANMessage->command, "HANDOVER\0");
char data[PACKETSIZE];
serialize(newcloudRANMessage, data);

signal(SIGPIPE, SIG_IGN);
CFRunLoopRef loop = CFRunLoopGetCurrent();
if( !loop ) {
    printf("Error: Cannot get current run loop\n");
    return 1;
}

redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
    /* Let *c leak for now... */
    printf("Error: %s\n", c->errstr);
    return 1;
}

redisMacOSAttach(c, loop);

redisAsyncSetConnectCallback(c,connectCallback);
redisAsyncSetDisconnectCallback(c,disconnectCallback);
redisAsyncCommand(c,getCallback,NULL,"SUBSCRIBE cloudRAN");

                                       // Serialize Data then send to Redis
//redisAsyncCommand(c, getCallback, (char*) "SET", "SET LTEdata %s", data, strlen(data));     // key for our data in this  case is LTEdata
redisAsyncCommand(c,NULL, NULL, "SET LTEdata %s", data);
//redisAsyncCommand(c, getCallback,(char*) "GET", "GET LTEdata");
redisAsyncCommand(c, callbackDeserialize,NULL, "GET LTEdata");

// Publish the information to the all subscribers.
redisAsyncCommand(c,NULL, NULL, "PUB cloudRAN %b",data,strlen(data));


CFRunLoopRun();
return 0;

最佳答案

在这个对 redisAsyncCommand 的调用中:

redisAsyncCommand(c,NULL, NULL, "SET LTEdata %s", data);

data 中出现的任何空字节都将终止 hiredis 字符串插值。由于您是二进制编码,这很可能会截断您的字符串。尝试指定长度以使其二进制安全:

redisAsyncCommand(c,NULL, NULL, "SET LTEdata %b", data, sizeof(data));

关于c++ - Redis pub/sub 序列化数据 struct C 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34669636/

相关文章:

c++ - 在 OpenGL 中的一个输入纹理上使用多个sampler2D

c - 为什么 Gwan 缓存我的结果,我可以禁用它吗?

redis - Redis 排序集中基于时间间隔的桶

redis - 是否有机会取回 Key 存储在 Redis 中的日期时间?

c++ - 如何在 C++ 中生成以下排列树?

c++ - QPushButton 的 Qt 背景图像

C 内存泄漏问题

ruby - 为什么我的 Redis 测试不如从对象中查找散列那么快?

c++ - C++0x 中的特殊成员函数

c - 没有任何参数和返回值的 C 函数是否需要堆栈才能执行?