Ээээ, как бы в задание написано как сделать хранилище:
Ключи и значения можно хранить на сервере в оперативной памяти, например используя 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);
}
Код набросал схематичный, проверки опущены, нужные заголовочные файлы тоже, на работспособность не проверял.