Redis发布/子序列化数据结构体C数据
Redis pub/sub serialized data struct C data
我想将我的序列化数据存储在redis上,并发布到我定义的通道。但是在redis中设置关键值似乎存在问题。我错过了什么解决方案?
提前谢谢。
#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("%dn", message->location_area);
printf("%dn", message->station_id);
printf("%sn", 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("%sn", 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("%sn", 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: %sn", c->errstr);
return;
}
printf("Connected...n");
}
void disconnectCallback(const redisAsyncContext *c, int status) {
if (status != REDIS_OK) {
printf("Error: %sn", 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 ");
char data[PACKETSIZE];
serialize(newcloudRANMessage, data);
signal(SIGPIPE, SIG_IGN);
CFRunLoopRef loop = CFRunLoopGetCurrent();
if( !loop ) {
printf("Error: Cannot get current run loopn");
return 1;
}
redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
/* Let *c leak for now... */
printf("Error: %sn", 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);
出现在CCD_ 1中的任何空字节将终止hiredis字符串插值。由于您是二进制编码,这可能会截断您的字符串。尝试指定长度以使其二进制安全:
redisAsyncCommand(c,NULL, NULL, "SET LTEdata %b", data, sizeof(data));
相关文章:
- C++:使用缓冲区中的数据填充结构
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- UE4 数据表结构错误
- 指针帮助:取消指向访问其内部数据的结构的指针
- 如何创建一个函数以读/写数据给结构成员
- TCP-Server以数据包结构(非Java客户端)发送文件
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- C# TCP 数据包结构
- 分割错误 (SIGSEGV) 获取数据作为结构向量中的输入时
- 用于存储数据的结构和外部二进制文件
- C++:我想将数据从结构复制/存储到单独的数组中
- 静态数据类型(结构)的组织
- 从 std::vector<无符号字符中的数据填充结构>
- 将来自 QByteArray 的数据放在结构中
- 用于在移动设备上存储来自数千个文件的数据的结构
- 体素数据/openvdb结构的工作原理
- Qt数据报结构结果:混合序列
- 如何在PINVOKE中传递带有字符串数据的结构
- 从较大的数据类型(结构)转换为较小的数据类型
- 从文本文件中读取数据到结构体中,然后输出数据