简单的客户端和服务器端的kv存储

客户端代码

#include <sys/socket.h>
#include <sys/types.h>
#include <iostream>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
int main() {
    sockaddr_in client_addr;
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock == -1) {
        perror("socket");
        return 0;
    }
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(1234);
    client_addr.sin_addr.s_addr = inet_addr("192.168.126.128");

    if(connect(sock, (sockaddr*)&client_addr, sizeof(client_addr)) == -1){
        perror("connect");
        return 0;
    }
    while(1){
        printf("put key: \n");
        char buf[100] = {};
        char choice[50]= {};
        scanf("%s", choice);
        int getOrset = 0;
        if(strcasecmp("get", choice) == 0) {
            char key[50];
            scanf("%s", key);
            sprintf(buf, "get %s", key);
        }else if(strcasecmp("set", choice) == 0) {
            getOrset = 1;
            char key[20];
            char num[20];
            scanf("%s", key);
            scanf("%s", num);
            sprintf(buf, "set %s %s", key, num);
        }
        if(send(sock, buf, strlen(buf), 0) == -1) {
            perror("send");
            return 0;
        }
        char recv_msg[100] = {};
        if(getOrset == 0 and recv(sock, recv_msg, 100, 0) != -1) {
            printf("%s\n", recv_msg);
        }
    };
    close(sock);
    return 0;
}

服务器端代码

#include <sys/socket.h>
#include <sys/types.h>
#include <iostream>
#include <netinet/in.h>
#include <unistd.h>
#include <string>
#include <unordered_map>
using namespace std;
unordered_map<string, string> dic;
string get_choice(string buf) {
    int j = 0;
    while(buf[j] != ' ') ++j;
    return buf.substr(0, j);
}
string get_key(string buf) {
    int j = 0;
    while(buf[j] != ' ') ++j;
    int i = j + 1;
    while(i < buf.size() and buf[i] != ' ') ++i;
    return buf.substr(j + 1, i - j - 1);
}

string get_value(string buf) {
    int j = buf.size() - 1;
    while(buf[j] != ' ') --j;
    return buf.substr(j + 1);
}

int main() {
    sockaddr_in server_addr;
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    int optval = 1;
    setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
    if(sock == -1) {
        perror("socket");
        return 0;
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(1234);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(sock, (sockaddr*)&server_addr, sizeof(server_addr)) == -1){
        perror("bind");
        return 0;
    }
    if(listen(sock, 5) == -1){
        perror("listen");
        return 0;
    }
    
    sockaddr_in client_addr;
    socklen_t len = sizeof(client_addr);
    int cfd = accept(sock, (sockaddr*)&client_addr, &len);
    while(1){
        char buf[100] = {};
        int bytesRead = recv(cfd, buf, 100, 0);
        if(bytesRead == -1) {
            perror("recv");
            return 0;
        }
        string choice = get_choice(buf);
        string send_msg;
        if(choice == "get") {
            string key = get_key(buf);
            string value = dic[key];
            send_msg = value;
            if(send(cfd, send_msg.c_str(), send_msg.size(), 0) != -1){
            };
        }else if(choice == "set") {
            string key = get_key(buf);
            string value = get_value(buf);
            dic[key] = value;
        }
    }
    close(cfd);
    close(sock);
    return 0;
}

功能

支持key value的set和get功能
语法:set key value
get key

遇到的坑:

  • recv阻塞导致客户端发送内容后不能发送下一条指令
  • 缓冲区未清空,导致recv没收到信息也返回上次内容,循环打印旧信息
  • 缓冲区未初始化为空,导致缓冲区内出现奇怪字符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值