使用socket和TCP网络协议实现的客户端和服务端示例,采用谷歌的protobuf数据传输协议(类似json),部署在Linux上

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;
        
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值