2013-03-09 2 views
1

Мне не удается подключиться к серверу redis, работающему по умолчанию (127.0.0.1:6379), используя credis_connect(). Вот тестовый код, который я использовал:Не удается подключиться к серверу redis

#include <stdio.h> 
#include "credis.h" 

int main(int argc, char **argv) 
{ 
    REDIS rh; 
    char *val; 
    int rc; 


    printf("connecting to server at Port:6379\n"); 
    rh = credis_connect(NULL, 6379, 10000); 

    if(rh == NULL) 
    { 
     printf("Error in connecting to server.\n"); 
     return -1; 
    } 
    printf("Connected to Redis Server. \n"); 

    /* ping server */ 
    rc = credis_ping(rh); 
    printf("ping returned: %d\n", rc); 


    /* set value of key "kalle" to "kula" */ 
    printf("Setting Key value to Redis Server.\n"); 
    credis_set(rh, "kalle", "kula"); 

    printf("Key value is set.\n"); 

     /* get value of key "kalle" */ 
    credis_get(rh, "kalle", &val); 
    printf("get kalle returned: %s\n", val); 

    /* close connection to redis server */ 
    credis_close(rh); 

    return 0; 
} 

FYI: Я бегу Redis 2.6.10 и credis 0.2.3 на Ubuntu 12.10.

+0

Удалось ли вам подключиться к тому же компьютеру, который запускает ваш код с помощью CLI? –

ответ

0

Я не думаю, что credis 0-2-3 может работать с современной версией Redis (2.6). credis 0-2-3 был выпущен в 2010 году, и Redis развился много.

Соединение завершается с ошибкой, так как credis необходимо проанализировать вывод команды INFO сразу после подключения сокета. Цель состоит в том, чтобы получить версию сервера Redis. Поскольку результат INFO изменился (теперь он включает комментарии для выделения разделов), credis больше не сможет извлечь версию, поэтому она возвращает ошибку.

Если вы хотите, чтобы исправить этот конкретный вопрос (но может быть и многие другие ...) вы просто должны изменить credis.c исходный код и заменить:

int items = sscanf(rhnd->reply.bulk, 
        "redis_version:%d.%d.%d\r\n", 
        &(rhnd->version.major), 
        &(rhnd->version.minor), 
        &(rhnd->version.patch)); 

по:

int items = sscanf(rhnd->reply.bulk, 
        "# Server\nredis_version:%d.%d.%d\r\n", 
        &(rhnd->version.major), 
        &(rhnd->version.minor), 
        &(rhnd->version.patch)); 

Мое предложение было бы перейти на hiredis, что является официальным клиентом C.

Смежные вопросы