客户端代码
#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没收到信息也返回上次内容,循环打印旧信息
- 缓冲区未初始化为空,导致缓冲区内出现奇怪字符