1

を使用して、デフォルト オプション (127.0.0.1:6379) で実行されている redis サーバーに接続できませんcredis_connect()。使用したテストコードは次のとおりです。

#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;
}

参考までに: ubuntu 12.10 で redis 2.6.10 と credis 0.2.3 を実行しています。

4

1 に答える 1

1

credis 0-2-3 は最新の Redis バージョン (2.6) では動作しないと思います。2010 年に credis 0-2-3 がリリースされ、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));

私の提案は、公式の C クライアントであるhiredisに切り替えることです。

于 2013-03-11T19:08:07.457 に答える