基于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 ...
随机推荐
- 数据库再设计(Database Redesign)
数据库设计有三个来源:(1)可以从现有数据开始设计数据库,例如从excel表格等,这种模式下需要考虑的问题是数据的normalization,最终通常将数据转化为BCNF范式:(2)设计新的数据库,这 ...
- [GitHub]第五讲:团队合作流程
文章转载自:http://blog.csdn.net/loadsong/article/details/51591631 前几天还都是一个开发者唱独角戏.但是尽管如此也可以看出 Git 带来的便利了, ...
- ORACLE EBS常用表及查询语句(最终整理版)
建议去看参考二 参考一: call fnd_global.APPS_INITI ...
- 钩子不仅仅是windows给你留的后门
说起钩子(Hook)熟悉windows开发的人应该比较熟悉,例如鼠标钩子.键盘钩子等.用简单的语言描述就是在正常处理流程中安置某个钩子,当执行到安置钩子的地方就将进入指定的钩子函数进行处理,待处理完再 ...
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...
- TSVN客户端复制文件
TSVN客户端复制文件 代码重构中,可能需要将一个大文件拆分成2个小文件,同时要保证拆分后的小文件继承原来的SVN历史记录. TSVN客户端只有Rename功能,没有Copy功能. 可进入Browse ...
- Spring - IOC简介
DI(Dependence Injection)依赖注入: userService依赖于容器注入的 这样拿的 这个过程由容器来控制,这个称为依赖注入. IOC(Inverse of control)控 ...
- JUI/DWZ 分页 Servlet
分页介绍 参考:官方用户手册中的"分页组件" 分页思路服务器返回当前页的数据,总条数,再由js来生成分页标签.分页是配合服务器端来处理的, 不是存js做的分页. 因 ...
- C++ Primer 有感(面向对象编程)
1.除了构造函数之外,任意非static成员函数都可以是虚函数.保留字virtual只在类内部的成员函数声明处出现,不能用在类定义体外部出现的函数定义上. 2.派生类只能通过派生类对象访问其基类的pr ...
- 从Linux启动过程到android启动过程
Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...