• Как сделать простой TCP сервер с "key-value" БД?

    @KupaKupychOfGenius
    Ээээ, как бы в задание написано как сделать хранилище:
    Ключи и значения можно хранить на сервере в оперативной памяти, например используя std::map.
    Но для начала придется ведь придумать протокол общения клиента и сервера, например, строка вида
    'set 10 значение1' - установка значения с конкретным ключём
    'get 10' - получение значения по ключу 10

    int main()
    {
        int sock, listener;
        struct sockaddr_in addr;
        char buf[1024];
        int bytes_read;
    
         //std::map - это контейнер типа key-value, он же хэш в простонародие, он же dictionary, он же словарь
         //вот его мы и объявляем, ключ у него целого типа, а значени - строка
         std::map<unsigned int,std::string>  storage;   
         std::string input_string;   // полученная строка 
         std::string operation;     
         std::string key_as_string;
         std::string value;
         unsigned int key_as_int;            
         ....
    
     while(1)
            {
                bytes_read = recv(sock, buf, 1024, 0);
                if(bytes_read <= 0) break;
                
                 //c std::string работать удобнее
                input_string = buf;
                
                //эту функцию вы уж как-нибудь сами напишите(своруйте с интерентов), в целом такая операция называется split
                parse_input_string(input_string,&operation, &key_as_string,&value); 
                key_as_int = stoi(key_as_string);
    
                 // пришел запрос на получение значения
                 if (operation == "get") {
                
                     //ищем ключ, в случае успеха метод find возратит нам итератор на элемент с нашим ключем
                    //в противном случае иетратор на элемент заглушку в конце контейнера
                    auto it = storage.find(key);  
                   //если ключ не найден
                   if (it == storage.end()) {        
                       buf = "not found";
                   else {
                       strcpy(buf, iterator->second.c_str() );   // получим значение и скопируем его в буфер для отправки клиенту
                   }
               } else if (operator == "set")  {
                     // если ключа еще нет, появится новая пара, если есть, то текуще значение затрется новым
                    storage[key_as_int] = value;  
                    buf = "saved successfully";
               }
                send(sock, buf, bytes_read, 0);
            }


    Код набросал схематичный, проверки опущены, нужные заголовочные файлы тоже, на работспособность не проверял.
    Ответ написан
    1 комментарий
  • Как сделать простой TCP сервер с "key-value" БД?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Своруйте с редиса
    Ответ написан
    5 комментариев
  • Как сделать простой TCP сервер с "key-value" БД?

    @K0lya28
    Получение и Изменение
    1)Через map.find() найти пару в std::map и получить итератор
    2)Если iterator == map::end(), ключа нет
    3)Отослать или изменить iterator->second

    Добавление
    1)map.insert(make_pair(ключ, значение))
    Ответ написан
    2 комментария