2015-04-13 13 views
0

Я пишу небольшое приложение на C++, которое может подключаться к экземпляру memcachedb, используя C++ API libmemcached.Не удается подключиться к memcachedb с помощью libmemcached

Экземпляр memcachedb был создан с помощью следующей команды:

memcachedb -m 64 -p 21201 -A 4096 -u memcachedb -l 127.0.0.1 -H /var/lib/memcachedb -f /var/lib/memcachedb/default.db -U off 

Я могу получить статы сервера, выполнив:

telnet 127.0.0.1 21201 
stats 
STAT pid 1972 
STAT uptime 124936 
STAT time 1428898165 
STAT version 1.2.0 
STAT pointer_size 64 
STAT rusage_user 5.687019 
STAT rusage_system 13.329336 
STAT ibuffer_size 512 
STAT curr_connections 5 
STAT total_connections 12 
STAT connection_structures 6 
STAT cmd_get 4 
STAT cmd_set 4 
STAT get_hits 4 
STAT get_misses 0 
STAT bytes_read 236 
STAT bytes_written 2171 
STAT threads 4 
END 

Чтобы получить статы сервера программно я использую следующие код:

#include <libmemcached/memcached.hpp> 

#include <string> 

#include <stdio.h> 
#include <string.h> 

using namespace std; 
using namespace memcache; 

int main(int argc, char **argv) { 

    std::string host(argv[1]); 
    int port; 
    istringstream(std::string(argv[2])) >> port; 

    printf("%s\n", "Instantiating client"); 

    Memcache first_client; 

    printf("Adding server host=[%s] port=[%d]\n", host.c_str(), port); 
    first_client.addServer(host, port); 

    printf("%s\n", "Getting server STATS"); 
    map<string, map<string, string> > my_stats; 
    bool gotStats = first_client.getStats(my_stats); 

    if (gotStats) { 
     printf("%s\n", "Got STATS"); 
    } else { 
     printf("%s\n", "Unable to get STATS"); 
    } 

    return EXIT_SUCCESS; 
} 

Я компилирую заявку п, используя следующие Makefile:

CXXFLAGS = -O2 -g -Wall -fmessage-length=0 
OBJS =  MemcachedExample.o 
LIBS =  -lmemcached 
TARGET = MemcachedExample 

$(TARGET): $(OBJS) 
$(CXX) -o $(TARGET) $(OBJS) $(LIBS) 

all: $(TARGET) 

clean: 
rm -f $(OBJS) $(TARGET) 

Когда я запустить приложение, используя следующую команду:

MemcachedExample 127.0.0.1 21201 

Это не удается извлечь Статистика сервера:

Instantiating client 
Adding server host=[127.0.0.1] port=[21201] 
Getting server STATS 
Unable to get STATS 

Что я делаю неправильно ? Буду признателен за понимание.

+0

вы можете сделать tcpdump над вашим интерфейсом lo и проверить трассировку на проводах, чтобы проверить возможные различия ?. – Raistmaj

ответ

0

Глядя на tcpdump, как указано @Rastmaj, я обнаружил, что в дампе для подключения через мою программу не было пакетов, связанных с соединением, которое я пытался установить.

Это заставило меня взглянуть на код интерфейса C++ для C Client Library для memcached. Я обнаружил, что пустой конструктор инициализировал объект memcached_st с использованием memcached("", 0), в то время как аргументы-конструкторы, принимающие hostname и port, не только инициализировали объект memcached_st с использованием , но также добавили сервер, используя функцию memcached_server_add.

Хотя нет никаких видимых причин, почему это работает при добавлении сервера только после инициализации memcached_st объекта, так как метод C++ memcache::Memcache::addServer делает точно так же, решение, которое я нашел просто изменение:

Memcache first_client; 

для

Memcache first_client("--SERVER=" + host + ":" + std::string(argv[2])); 

Это решает мою проблему, но мне по-прежнему не хватает объяснения этого поведения, оцениваются дальнейшие соображения.