我在正在编写的C程序中使用Redis(使用hiredis C绑定)。
这是我的代码:
void insert(redisContext* c,char* buf){
static redisReply *reply;
const char* hash="asdf";
char* cmd=(char*)malloc((strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE)*sizeof(char));
//hash=getHash(buf);
memcpy(cmd,"SET ",(size_t)strlen("SET "));
memcpy(cmd+strlen("SET "),hash,(size_t)strlen(hash));
memcpy(cmd+strlen("SET ")+strlen(hash)," ",(size_t)strlen(" "));
memcpy(cmd+strlen("SET ")+strlen(hash)+strlen(" "),buf,(size_t)CHUNKSIZE);
fwrite(cmd,strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE,sizeof(char),stdout);
printf("\n\n\n\n\n\n");
reply=(redisReply*)redisCommand(c,cmd);
freeReplyObject(reply);
free(cmd);
}
如您所见,cmd看起来像:SET asdf xxx
,其中xxx是512字节长(二进制数据)。
当二进制数据字符串以'\ n'开头时出现问题。我一直收到错误(分段错误)。
有人有什么想法吗?
非常感谢,
答案 0 :(得分:1)
我正在使用您发布的代码并且没有发生任何崩溃。 我的代码是:
#define CHUNKSIZE 512
char asd[CHUNKSIZE];
memset(asd, 0, 512);
asd[0] = '\n';
insert(c, asd);
尝试使用valgrind
运行您的应用,这可能会让您在崩溃之前更好地了解错误。
答案 1 :(得分:1)
hiredis docs:
当您需要在命令中传递二进制安全字符串时,可以使用%b说明符。与指向字符串的指针一起,它需要字符串的size_t length参数:
reply = redisCommand(context, "SET foo %b", value, valuelen);