c++ redis客户端, 带详情输入输出

文章目录

    • 使用方法
    • 输入
    • 输出解释
    • 代码
    • 输出

使用方法

g++ main.cpp
./a.out -h 127.0.0.1 -p 6379

输入

一行内输入 redis 命令
keys*
set name
get name
等等 redis命令

输出解释

输入redis: redis收到的redis协议的数据
human输入: 你输入的原始字符
redis输出: redis返回的基于 redis协议的数据
human输出: 稍微处理过的 redis放回的数据

代码

#include <iostream>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <vector>
#include <unistd.h>
#include <sstream>
#include <getopt.h>
using namespace std;string ip = "127.0.0.1";
int p = 6379;class TcpCli {
public:string ip;int port;int fd;explicit TcpCli(const string& ip = "127.0.0.1", int port = 80) {this->ip = ip;this->port = port;fd = -1;}~TcpCli() {if (fd != -1) {close(fd);}}bool connect() {// 电话号码fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1) {return false;}// 拨号sockaddr_in saddr{};saddr.sin_family = AF_INET;saddr.sin_port = htons(port);saddr.sin_addr.s_addr = inet_addr(ip.c_str());int ret = ::connect(fd, (sockaddr *) &saddr, sizeof(saddr));if (ret == -1) {return false;}return true;}int send(const string& data) {return ::send(fd, data.c_str(), data.size(), 0);}int recv(string& data) {char buf[1024];int ret = ::recv(fd, buf, sizeof(buf), 0);if (ret > 0) {data.assign(buf, ret);}return ret;}};class RedisRequestProtocol {
public:static string makeRequest(const vector<string> &args) {string res = "*" + to_string(args.size()) + "\r\n";res += "$" + to_string(args[0].size()) + "\r\n";res += args[0] + "\r\n";for (int i = 1; i < args.size(); i++) {res += "$" + to_string(args[i].size()) + "\r\n";res += args[i] + "\r\n";}return res;};public:static string set(const string &key, const string &value) {return makeRequest({"set", key, value});}static string get(string key) {return makeRequest({"get", key});}
};string beautify(const string& data) {string res;string res2;for (int i = 0; i < data.size(); i++) {if (data[i] != '\r' && data[i] != '\n') {res += data[i];res2 += data[i];continue;}if (data[i] == '\r') {res += "\\r\\n";i++;}}return res;
}string deleteSome(const string& data, char ch) {string res;for (int i = 0; i < data.size(); i++) {if (data[i] == ch) {int pos = data.find("\r\n", i);i = pos + 1;} else {res += data[i];}}return res;
}string human(const string& data) {if (data.empty()) {return data;}if (data[0] == '-') {return data.c_str() + 1;}string res;// 删掉多行字符串标记string temp = deleteSome(data, '$');// 删去数组标记temp = deleteSome(temp, '*');return res = temp;
}void tishi(const string& addr, string op = "输入redis:") {cout << op << addr;
}class RedisCli {
public:TcpCli cli;string addr;RedisRequestProtocol requestProtocol;RedisCli(string ip = "127.0.0.1", int port = 6379) : cli(ip, port) {addr = ip + ":" + to_string(port);if (!cli.connect()) {cout << "connect error" << endl;exit(-1);}}template<class ...Args>void runCommand(const Args... args) {string request = requestProtocol.makeRequest({args...});tishi(addr + "> ");cout << beautify(request) << endl;auto ret = cli.send(request);if (ret == -1) {throw "send error";}string data;ret = cli.recv(data);if (ret == -1) {throw "recv error";}tishi(addr + "> ", "redis输出:");cout << beautify(data)<< endl;tishi(addr + ">\n", "human输出:");cout << human(data);}
};void parseArgv(int argc, char** argv) {int option;while((option=getopt(argc, argv, "h:p:"))) {switch(option) {case 'h':ip = optarg;break;case 'p':p = atoi(optarg);break;default:return;}}
}int main(int argc, char** argv) {parseArgv(argc, argv);RedisCli cli(ip, p);string command;cout << "*********************为了看的清楚, 我们把返回数据的\\r\\n打出来了, 并分行显示*********************" << endl;while (true) {tishi(cli.addr + "> ", "human输入:");if (!getline(cin, command) || command.empty()) {continue;}if (command == "q" || command == "Q") {break;}stringstream ss(command);vector<string> args;string arg;while(ss >> arg) {args.push_back(arg);}cli.runCommand(args);}}

输出

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/256729.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

智能优化算法应用:基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹈鹕算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹈鹕算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Cisco Packet Tracer配置命令——交换机篇

交换机VLAN配置 在简单的网络环境中&#xff0c;当交换机配置完端口后&#xff0c;即可直接应用&#xff0c;但若在复杂或规模较大的网络环境中&#xff0c;一般还要进行VLAN的规划&#xff0c;因此在交换机上还需进行 VLAN 的配置。交换机的VLAN配置工作主要有VLAN的建立与删…

算术运算(这么简单?进来坐坐?)

先热热身 算术运算&#xff0c;也称为四则运算&#xff0c;包括加法、减法、乘法和除法。此外&#xff0c;算术运算还包括乘方和开方。 在算术中&#xff0c;加减被视为一级运算&#xff0c;乘除被视为二级运算&#xff0c;乘方和开方被视为三级运算。在一道算式中&#xff0c;…

佳明(Garmin) fēnix 7X 增加小睡检测功能

文章目录 &#xff08;一&#xff09;零星小睡&#xff08;二&#xff09;小睡检测&#xff08;三&#xff09;吐槽佳明&#xff08;3.1&#xff09;心率检测&#xff08;3.2&#xff09;光线感应器&#xff08;3.3&#xff09;手表重量&#xff08;3.4&#xff09;手表续航 &a…

nodejs微信小程序+python+PHP的智能停车系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

在vue中深度选择器的使用

一、为什么要使用深度选择器 在vue中&#xff0c;当我们使用了第三方库中的组件时&#xff0c;想要更改一些样式&#xff0c;达到我们想要的效果&#xff0c;由于scoped的影响直接编写同名样式时&#xff0c;是覆盖不了组件内的样式的。 为了达到我们想要的效果&#xff0c;…

77. 组合

组合 描述 : 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 题目 : LeetCode 77. 组合 : 77. 组合 分析 : 请看回溯怎么回事 , 里面讲的很清晰 . 解析 ; class Solution {public List<List<Integ…

跨境电商危机公关:应对负面舆情的策略优化

随着跨境电商的快速发展&#xff0c;企业在全球市场中面临的竞争与挑战也日益复杂。在这个数字时代&#xff0c;负面舆情一旦爆发&#xff0c;可能对企业形象和经营造成深远影响。 因此&#xff0c;跨境电商企业需要建立有效的危机公关策略&#xff0c;以迅速、果断、有效地应…

爬虫解析-jsonpath (五)

jsonpath只能解析本地文件 jsonpath的使用&#xff1a; obj json.load(open(.json文件,r,encodingutf-8))place_name jsonpath.jsonpath(obj, json语法) 目录 1.安装jsonpath 2.Xpath和jsonpath的语法对比 练习&#xff1a;使用jsonpath解析JSON文件 3.使用jsonpath抓取…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

扩展卡尔曼滤波技术(Extended Kalman Filter,EKF)

一、概念介绍 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全包含噪声的测量中&#xff0c;估计动态系统的状态&#xff0c;然而简单的卡尔曼滤波必须应用在符合高斯分布的系统中。 扩展卡尔曼滤波就是为了解决非线性问题&#xff0c;普通卡尔曼…