github上项目源码链接:https://github.com/SuperApeA/protobuf-demo
运行环境:CentOS7,C++11,cmake3,protobuf3
项目目录结构:
protobuf传输协议文件:
写完”.proto"文件之后,通过proto的命令在cmd或者Linux中生成相应的”.pb.cc“和“.pb.h”文件,首先进入到proto文件同级目录下,然后输入以下命令,记得先安装proto3
protoc --cpp_out=. ./Cartoon.proto
syntax = "proto3";
import "google/protobuf/timestamp.proto";
message Cartoon{
int32 Id = 1;
string name = 2;
string company = 3;
google.protobuf.Timestamp time = 4;
}
message CartoonList{
repeated Cartoon cartoonList = 1; //CartoonList
}
message CartoonRequest{
int32 query = 1; //命令码 1->add 2->selectById 3->selectAll
CartoonList cartoon = 2; //add 时一个Cartoon list, 默认放在 CartoonInf 文件中
int32 selectById = 3; //select 时 Cartoon的Id
bool selectAll = 4; //查询所有的 Cartoon
}
message CartoonResponse{
string res = 1;
CartoonList cartoon = 2; //返回的 select Cartoon的信息
}
对socket进行一下封装:
//
// Created by Aaj on 2021/8/6.
//
#ifndef MYPROTOCOLBUF_MYTCPSOCKET_H
#define MYPROTOCOLBUF_MYTCPSOCKET_H 1
#include<string.h>
#include<iostream>
#include<string>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<unistd.h>
using namespace std;
void CHECK(bool res){
if(res == false){
exit(-1);
}
}
class MyTcpSocket{
private:
int _sock;
public:
MyTcpSocket() : _sock(-1){
}
void setNewSockFd(int newsockfd){
_sock = newsockfd;
}
//1.创建套接字
bool Socket(){
//函数原型 int socket(int domain, int type, int protocol);
//int domain(协议族) 参数为 AF_INET 表示 TCP/IP_IPv4
//int type(套接字类型) 参数为SOCK_STREAM 表示 TPC流
//int protocol 参数为0,因为 domain 和 type 已经确定
_sock = socket(AF_INET, SOCK_STREAM, 0);
if(_sock < 0){
perror("socket error");
return false;
}
return true;
}
//2.为套接字绑定地址信息
bool Bind(string& ip,uint16_t& port) const{
struct sockaddr_in addr; //加上struct为c写法
bzero(&addr, sizeof(addr)); //清零
addr.sin_family = AF_INET; //TCP
addr.sin_port = htons(port); //htons是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。
addr.sin_addr.s_addr = inet_addr(ip.c_str()); //将IP转为二进制形式
size_t len = sizeof(struct sockaddr_in);
int binding = bind(_sock,(struct sockaddr*)&addr, len);
if(binding < 0){
perror("bind error");
return false;
}
return true;
}
//3.服务端监听
bool Listen(int backlog = 5) const {
int listening = listen(_sock,backlog);
if(listening < 0){
perror("listen error");
return false;
}
return true;
}
//4.客户端请求连接
bool Connect(string& ip,uint16_t& port) const {
struct sockaddr_in addr;