这个协议不知我在上面耗费了多长时间,也有人问过我咋回事,这个protocol不长,但对于我来说理解起来很费劲,今天回来看看忽然看懂了(80%),只能说不知看了多少遍

其实这些东西应该在来的一个月这样子都要会的,一直拖到现在,其实那时时真心看不懂

#ifndef Protocol_Base_H
#define Protocol_Base_H //#include <boost/cstdint.hpp>
#include <string.h>
#pragma pack(push, 1)
//-----------基础协议--------------
struct Protocol
{
unsigned char cmd_type;
int size;//content的长度, 不包含本协议头
void* content;//内容的地址 int to_buffer(void* buffer, int buffer_len)
{
if(!buffer)
return -;
//-sizeof(void*)其实这个content没多大作用其实就是标示了一个位置,发送的时候需要将其减去,因为后面直接将内容复制到了这个指针的位置
int total_size = size + sizeof(Protocol) - sizeof(void*);
if(buffer_len < total_size)
return -; Protocol* p = (Protocol*)buffer;
p->cmd_type = this->cmd_type;
p->size = this->size;
if (content)
{
//这句让我理解这个协议费劲了苦头,今天在看终于懂了,也许对c++基础好点的一下就能看懂,我不知看了多少次
//原来看实在不理解这个&p->content,为什么指针还是要取地址,一直在想是指针了还取指针干什么,一直在钻
//其实Protocol* p = (Protocol*)buffer;这个转换可以看下content的值是0,buffer里面存放了指针,然后取指针的地址
//也就是buffer里面这个指针的地址,memcpy将内容复制到指针地址的位置,正好在buffer里面
//包结构(1字节:cmd_type)(4字节:size表示内容的长度)(要发送的内容)
memcpy(&p->content, content, size);
}
return total_size;
} bool from_buffer(void* buffer, int len)
{
if(!buffer)
return false;
int head_size = sizeof(Protocol) - sizeof(void*);
if(len < head_size)//代表空数据
return false; Protocol* p = (Protocol*)buffer;
//*this = *p; 长度为5的情况下会出错
this->cmd_type = p->cmd_type;
this->size = p->size;
if(size)
{
if(len < head_size + (int)size)
{
return false;
}
//这个有点难理解,buffer里面是没有content内容的,个人感觉可以将content理解成一个位置,然后去这个位置的地址,正好是内容的地址
content = &p->content;
}
return true;
}
}; #pragma pack(pop) #endif //Protocol_Base_H #include <iostream>
#include <vector>
#include "protocol.h"
using namespace std;
//模拟放松命令是1,发送一个int 100
//发送的时候需要分配一个buffer,然后发送这个buffer,接收的时候需要分配一个buffer,然后从这个buffer里面解析
void* g_data = new char[];
int g_len;
void send()
{
void* data = new int;
*(int*)data = ;//数据
int len = ; //长度
int cmd = ; //命令
vector<char> buffer;
buffer.resize(len + sizeof(Protocol)); Protocol pt = {};
pt.cmd_type = cmd;
pt.content = data;
pt.size = len;
g_len = pt.to_buffer(&buffer[], buffer.size());//注意不要&buffer因为buffer是对象在栈上的地址
memcpy(g_data, &buffer[], g_len);//复制到这个全局的里面方便 } void recv()
{
Protocol pt = {};
pt.from_buffer(g_data, g_len);
cout << *(int*)pt.content;//这样就可以按照协议发送各种结构体形式的了,这边解析之后强转一下就行了
} int main()
{
send();
recv();
getchar();
return ;
}

客户端服务端通信protocol的更多相关文章

  1. 基于Delphi实现客户端服务端通信Demo

    在开始之前我们需要了解下这个Demo功能是啥 我们可以看到这是两个小project,左边的project有服务端和客户端1,右边的project只有一个客户端2 效果就是当两个客户端各自分别输入正确的 ...

  2. go 客户端服务端通信

    client.go package main import ( "bufio" "encoding/json" "fmt" "ha ...

  3. MVC验证10-到底用哪种方式实现客户端服务端双重异步验证

    原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...

  4. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  5. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  6. Eureka源码探索(一)-客户端服务端的启动和负载均衡

    1. Eureka源码探索(一)-客户端服务端的启动和负载均衡 1.1. 服务端 1.1.1. 找起始点 目前唯一知道的,就是启动Eureka服务需要添加注解@EnableEurekaServer,但 ...

  7. winsock 编程(简单客户&服务端通信实现)

    winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if  Server receive the message, ...

  8. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  9. winform 客户端采用HTTP协议与服务端通信

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

随机推荐

  1. Oracle数据库对象_同义词

    同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写. 同义词的概念和类型 利用同义词可以为用户的一个对象,或者其他用户的一个对象定义别名,从而简化命 ...

  2. iOS 自定义view里实现控制器的跳转

    1.view里实现控制器的modal 拿到主窗口的根控制器,用根控制器进行modal需要的modal的控制器 场景:点击自定义view里的按钮实现控制器的modal UIViewController ...

  3. 单机版简单弹幕墙demo (jqery+bootstrap)

    最近在看fcc  ,上面有一个弹幕墙设计的题目,要求从后端获取数据,显示出来.百度,谷歌都没找到相关好的例子作为借鉴,索性按照自己的思路写了一个简单的demo  .在做demo的过程中遇到最大的问题就 ...

  4. ArcGIS 坐标系统文件

    坐标是GIS数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确的坐标. ArcGIS自带了多种坐标系统,在${ArcGISHome}Coordinate Systems目录下可 ...

  5. virtualbox安装增强包及配置共享文件夹

       因为需要在host及虚拟机间传输数据,想使用共享文件夹.但是单独设置了共享文件夹后在centos里找不到共享文件夹,看了下要安装增强包.好吧,顺 便也解决下鼠标切换的问题,省的老是按右CTL切换 ...

  6. VS默认环境设置

    VS2010的工具菜单-->导入导出设置-->重置所有设置

  7. 4_1 wp8数据绑定与独立存储空间[wp8特色开发与编程技巧]

    Wp8数据绑定与独立存储空间 数据绑定为基于 Silverlight 的应用程序提供了一种显示数据并与数据进行交互的简便方法. 数据的显示方式独立于数据的管理. UI 和数据对象之间的连接或绑定使数据 ...

  8. js 字符串“123”,变成整数123,不用parseInt 函数

    var s = "123"; console.log(s.charAt(0)*100+s.charAt(1)*10+s.charAt(2)*1);

  9. NSS_04 extjs中grid接收datetime类型参数列

    今天在做用户列表时发现, asp.net mvc3的控制器在返回JsonResult结果时, 会把对象内的DateTime类型成员,解析为类似于\/Date(1238606590509)\/的格式 , ...

  10. linux发展前景如何?

    2014-01-09 18:54Linux将不会取代Windows成为主流的桌面操作环境, 但它很有可能在信息接入设备中独霸天下. 为什么Linux无法取代Windows呢?最主要的原因是大多数最终用 ...