基于libevent的tcp拆包分包库
TCP/IP协议虽然方便,但是由于是基于流的传输(UDP是基于数据报的传输),无论什么项目,总少不了解决拆包分包问题。
以前的项目总是每个程序员自己写一套拆包分包逻辑,实现的方法与稳定性都不太一致。终于有了做基线的机会,自己写了一个基于libevent的拆包分包库。
本文档黏贴一些核心的内容。
//回调接口
class ITcpPacketNotify { public: virtual void OnConnected(int fd) = 0; virtual void OnDisConnected(int fd) = 0; virtual void OnTimeOutError(int fd) = 0; virtual void OnBuffOverFlow(int fd) = 0; //提取包,需要业务层返回解析出包的长度,或者舍弃一些不合格的包,成功解析出包返回true virtual bool OnAnalyzePacket(int fd,const char* buff,int bufflen,int& packetlen,int &ignore) = 0; //业务层处理包回调,如果需要返回包,可以直接在respond参数和respondlen参数返回,长度不得超过40960 virtual void OnPacketArrived(int fd,const char* packet,int packetlen,char* respond,int& respondlen) = 0; }; |
提供了两种错误情况的通知,跟别的库不太一样的地方是,需要业务层实现拆包逻辑,毕竟每个项目的协议不一样。然后就会收到packet的通知。
//提取包,需要业务层返回解析出包的长度,或者舍弃一些不合格的包,成功解析出包返回true virtual bool OnAnalyzePacket(int fd, const char* buff, int bufflen,int& packetlen, int &ignore) //数据长度 packetlen = length + 12; |
上面是某种协议的拆包例子。
typedef struct _TcpPacketConfig _TcpPacketConfig() } TcpPacketConfig; class ITcpPacketManager TCPPACKET_API ITcpPacketManager* CreateTcpPacketManager(); TCPPACKET_API void DestroyTcpPacketManager(ITcpPacketManager* manager); |
对外的接口方法。
bool CTcpPacketImp::Start(_TcpPacketConfig & config, ITcpPacketNotify* notify) void CTcpPacketImp::Stop() bool CTcpPacketImp::SendPacket(int fd, const char* packet, int packetlen) |
转移到m_libEvent实现。
最核心的功能代码如下。
一些数据定义:
#include <event2/bufferevent.h> struct _Conn; //服务器属性封装对象 typedef struct _Server Server; |
头文件:
class CLibEvent static ITcpPacketNotify * m_notify; |
cpp:
#include "StdAfx.h" #include <string> #include <assert.h> #include <WinSock2.h> CLibEvent::CLibEvent(void) CLibEvent::~CLibEvent(void) bool CLibEvent::StartServer(int port, short workernum, unsigned int connnum, int read_timeout, int write_timeout,ITcpPacketNotify* notify) void CLibEvent::StopServer() void CLibEvent::DoRead(struct bufferevent *bev, void *ctx) //拷贝缓冲池的内存到Conn,最大缓冲不超过emMaxBuffLen } } void CLibEvent::CloseConn(Conn *pConn) void CLibEvent::DoError(struct bufferevent *bev, short error, void *ctx) void CLibEvent::DoAccept(struct evconnlistener *listener, evutil_socket_t fd,struct sockaddr *sa, int socklen, void *user_data) DWORD WINAPI CLibEvent::ThreadServer(LPVOID lPVOID) DWORD WINAPI CLibEvent::ThreadWorkers(LPVOID lPVOID) bool CLibEvent::SendPacket(int fd, const char* packet, int packetlen) return true; ITcpPacketNotify * CLibEvent::m_notify=NULL; |
基于libevent的tcp拆包分包库的更多相关文章
- 基于 libevent 开发的 C++ 11 高性能网络服务器 evpp(360的作品)
evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库. 特性: 现代版的C++11接口 非阻塞异步接口都是C++ ...
- PHP写的异步高并发服务器,基于libevent
PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ 本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...
- 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET
基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...
- 公布一个基于 Reactor 模式的 C++ 网络库
公布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...
- 基于“泵”的TCP通讯(接上篇)
基于“泵”的TCP通讯(接上篇) 上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的 ...
- Netty系列(四)TCP拆包和粘包
Netty系列(四)TCP拆包和粘包 一.拆包和粘包问题 (1) 一个小的Socket Buffer问题 在基于流的传输里比如 TCP/IP,接收到的数据会先被存储到一个 socket 接收缓冲里.不 ...
- libevent实现TCP 服务端
libevent实现Tcp Server基于bufferevent实现 /******************************************************** Copyri ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 基于Libevent的HTTP Server
简单的Http Server 使用Libevent内置的http相关接口,可以很容易的构建一个Http Server,一个简单的Http Server如下: #include <event2/e ...
随机推荐
- 为学Android,我看了这些书
刚刚开始新的学习生活时,很容易走错方向,然后,这意味着不知道该学习什么,不知道该怎样学习,很显然,我写下这句话意味着我走过这样的路,为此,就付出了不小的代价,浪费了很多时间. 这篇文章当然 ...
- 最简单的基于FFmpeg的AVfilter例子(水印叠加)
===================================================== 最简单的基于FFmpeg的AVfilter例子系列文章: 最简单的基于FFmpeg的AVfi ...
- javascript 把时间戳转为时间 ajax HTML拼装
这个目的是记下来,好让我以后可以看一下,这个脚本可是反反复复写了我N天啊!! 全部写下,以备后用! Date.prototype.format = function(format) { var o = ...
- 海量数据挖掘MMDS week4: 推荐系统之隐语义模型latent semantic analysis
http://blog.csdn.net/pipisorry/article/details/49256457 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Android反编译获取源码-android学习之旅(70)
上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...
- Java进阶(二十四)Java List集合add与set方法原理简介
Java List集合add与set方法原理简介 add方法 add方法用于向集合列表中添加对象. 语法1 用于在列表的尾部插入指定元素.如果List集合对象由于调用add方法而发生更改,则返回 tr ...
- (四十二)tableView的滑动编辑和刷新 -局部刷新和删除刷新 -待解决问题
tableView的局部刷新有两个方法: 注意这个方法只能用于模型数据的行数不变,否则会出错. [self.tableView reloadRowsAtIndexPaths:<#(NSArray ...
- Ubuntu15.04 + Matlab2014a + MatConvNet install and compile
MatConvNet is a MATLAB toolbox implementingConvolutional NeuralNetworks (CNNs) for computer vision a ...
- FFMPEG结构体分析:AVStream
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...
- 开源框架VTMagic的使用介绍
VTMagic 有很多开发者曾尝试模仿写出类似网易.腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于后续维护和扩展.琢磨良久,最终决定开源这个耗时近两年打磨而成的框架,以便大家可以快速实 ...