浏览 6555 次
锁定老帖子 主题:仿mbuf机制实现自己的不定长内存池
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-22
/* * Copyright(c)2008 * * 文件名称: mbuf * 文件标识: * 摘 要: 仿照tcp/ip的mbuf机制实现自己的mbuf pWriter只仅仅表示我们当前的写指针位置, 而我们的iUnused只仅仅的表示我们的写指 针位置距离我们的buff+MBUF_BUFFER_SIZE 还有多少个可用字节数目。 pReader只仅仅表示我们当前的读指针位置, 而我们的iUsed也只仅仅表示我们的读指针 位置距离我们的pWriter指针还有多少字节 这个再次注意,我们的iUnused+iUsed不一定 就等于buff的总体长度MBUF_BUFFER_SIZE, 这两者之间没有任何联系 * * 当前版本: cobra_for_window 1.00 * 作 者: 关中刀客 * E-Mail : guanzhongdaoke@gmail.com * Blog : http://guan-zhong-dao-ke.blog.163.com/ * 完成时间: 2008年04月22日 */ #include <Windows.h> struct mbuf { public: enum { MBUF_BUFFER_SIZE = 2048 }; public: struct mbuf* pNext; struct mbuf* pRef; char* pReader; char* pWriter; size_t iUsed; size_t iUnused; char buff[MBUF_BUFFER_SIZE]; public: inline void init_mbuf() { pNext = NULL; pRef = this; pReader = buff; pWriter = buff; iUsed = 0; iUnused = MBUF_BUFFER_SIZE; memset(buff, 0, sizeof(buff)); } }; struct mbuf; class mbufpool { private: struct mbuf* m_pBegin; struct mbuf* m_pEnd; struct mbuf* m_pFinish; size_t m_iBytes; public: mbufpool(); ~mbufpool(); public: /* 得到数据开始的节点 */ mbuf* begin(); /* 得到数据结尾的节点 */ mbuf* end(); /* 得到当前mbufpool中所存字节的总数 */ size_t get_bytes_number(); /* 设计当前mbufpool中所存字节的总数 */ void set_bytes_number(size_t iBytes); /* 增加制定数目的mbuf节点 */ void resize(size_t iNum); /* m_pBegin向后移动 */ void next(); /* 压入一些节点 */ void push_node(mbuf* pNode); /* 压入一定长度的数据 */ void push_data(const char* pData, size_t iNum); /* 得到一定数目的字节 */ bool pop_data(char* pData, size_t iNum); /* 销毁mbufpool */ void destroy(); private: /* 从系统中分配节点 */ void malloc_mbuf_from_system(); }; class cobra_socket { private: SOCKET m_sock; mbufpool m_recvpool; mbufpool m_sendpool; public: cobra_socket(); ~cobra_socket(); public: void init_cobra_socket(size_t iRecvpollSize, size_t iSendPoolSize); bool create_socket(); bool connect_to_server(const char* pIP, u_short port); bool bind_to_window(HWND hWnd, int wMsg, int iMsg); bool logic_recv(char* pBuff, size_t iNum); void logic_send(const char* pBuff, size_t iNum); bool start_recv(); bool start_send(); void close_socket(); void destroy_cobra_socket(); };感觉这个方法挺不错的,当然,如果各位朋友有更好的建议或者意见的话,欢迎和我联系^__^ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-22
libevent 最新的代码库中,也开始加入了类似的 buffer_chain 。
在 ACE 中,有 MsgBlock 类,也是实现这种功能的。 贴代码用一下代码标签吧,要不然很难看。 |
|
返回顶楼 | |