2011-12-16 2 views
0

내가 작성중인 C 프로그램에서 Redis를 사용하고 있습니다 (hiredis C 바인딩 포함). xxx는 (이진 데이터) 512 바이트이고, SET asdf xxx : 당신이 볼 수 있듯이Redis : 데이터가 개행 문자로 시작하는 경우 SET 명령

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를은 다음과 같습니다

여기 내 코드입니다.

이진 데이터 문자열이 '\ n'으로 시작하면 문제가 발생합니다. 계속 오류가 발생합니다 (세분화 오류).

누구든지 아이디어가 있습니까?

미리 감사드립니다.

답변

1

내가 게시 한 코드를 사용하고 있으며 충돌이 없습니다. 내 코드는 다음과 같습니다

#define CHUNKSIZE 512 
char asd[CHUNKSIZE]; 
memset(asd, 0, 512); 
asd[0] = '\n'; 
insert(c, asd); 

은 아마 당신이 충돌하기 전에 무엇이 잘못의 더 나은 아이디어를 줄 것이다 valgrind 사용하여 응용 프로그램을 실행 해보십시오.

+0

정말 감사합니다 : 함께 문자열에 대한 포인터로, 그것은 문자열의 size_t로 길이 인수가 필요합니다. 분명히 다른 오류입니다. 매우 감사, – Eamorr

1

hiredis 워드 프로세서 :

는 명령에 바이너리 안전 문자열을 전달해야

에서, % B 형 지정자를 사용할 수 있습니다. 피드백에 대한

reply = redisCommand(context, "SET foo %b", value, valuelen); 
관련 문제