最近在考虑一个客户端底层通讯模块的实现问题,我需要做的就是把我的套接字绑定到窗口上,当套接字有事件产生,比如可读,关闭等消息的时候,直接通过窗口消息通知我,我在做一定的处理,客户端需要实现一个可伸缩的内存池来管理通讯的数据,上层在一桢中可压入许多待发送的数据,底层在一桢可接受许多服务器端的数据。所以我打算使用变长的内存池来实现,以前看过tcp/ip底层的mbuf实现机制,感觉很不错,所以这次做了一些改进,来实现我的不定长内存池策略。
/*
* 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();
};
感觉这个方法挺不错的,当然,如果各位朋友有更好的建议或者意见的话,欢迎和我联系^__^
分享到:
相关推荐
dpdk内存池mempool的源码实现 本文将从dpdk内存池mempool的源码实现中提炼出相关知识点,并对标题、描述和标签进行详细解释。 一、内存存储体系结构 dpdk内存池mempool的源码实现中,内存存储体系结构可以分为四...
每个层次可能会对数据进行封装或解封装,`mbuf`作为一个通用的缓冲区管理机制,能够方便地在这些层次间传递数据,而无需频繁地进行内存分配和复制。 从文件列表中的"mbuf1.0"来看,可能提供的是`mbuf`实现的旧版本...
IP处理模块负责处理和转发IP数据包,而Mbuf则是一种内存管理机制,用于高效地存储和传递网络数据。 IP处理模块是操作系统内核中的一个组件,它的主要职责是接收来自网络接口层的IP数据包,执行校验、路由选择、分片...
3. 内存池管理:为了提高效率,MBUF通常使用内存池进行预先分配,减少频繁的系统调用。 4. 快速操作:MBUF的设计考虑了快速复制、合并和拆分等操作,以适应网络协议处理的需求。 在TCP/IP协议栈实现中,TCP代码负责...
在网络交互中,各层之间的数据传输是很关键的东西(可惜,开始做的时候没有注意到这点)...mbuf的设计可以使各层数据的传输更加简单,这是我写的第一个版本,很简单。没有设计多个数据包的传输,还在写吧(随时更新吧)
`mbuf`是内存管理的一种优化方式,它将多个小的物理内存块链接起来,形成一个连续的逻辑内存空间。这种设计使得`mbuf`能够灵活地适应不同大小的数据包,而无需每次都分配新的内存。`mbuf`通常包含两个主要部分:数据...
MBUF 结构中有六个成员,它的总长是20字节。成员m_flags指示了MBUF的类型,有四种不同的类型: 1. 普通MBUF,用于保存用户数据,拥有108字节的数据空间(md_data数组),指针m_data指向缓存中的某个位置。 2. 带有...
mbuf(message buffer)是许多操作系统中用于处理网络数据的一种内存管理机制,特别是在FreeBSD和OpenBSD等系统中广泛使用。mbuf主要用于存储小块的数据,如网络包头或者部分数据报文。它采用了链表结构,允许动态...
Socket和Mbuf是计算机网络编程中的重要概念,特别是在操作系统内核和网络协议栈中起着核心作用。在本文中,我们将深入探讨这两个概念及其在实际项目中的应用。 首先,让我们来了解一下什么是`socket`。Socket是网络...
Socket编程是计算机网络编程中的重要组成部分,主要用于实现进程间的通信,尤其在网络环境中,不同计算机之间的...开发者应当关注这个版本的文档和示例代码,以便更好地理解和利用mbuf机制,提升自己的socket编程技能。
《TCP/IP详解 卷2 实现》是一本深入解析TCP/IP协议实现的著作,通过丰富的图例和实际的C代码示例,使读者能够更好地理解和掌握TCP/IP的内部工作机制。书中的内容涵盖了从基本的存储器管理机制到复杂的协议特性,如多...
这部分内容介绍了mbuf是如何存储在内存池中的,以及这种存储方式的优势。 **7.3 构造函数** 这部分内容介绍了mbuf的构造函数及其用法,帮助开发者更好地使用mbuf进行数据包处理。 **7.4 分配与释放mbuf** 这部分...
- 网络报文缓冲区管理(librte_mbuf):DPDK定义了mbuf来表示网络报文,它是一种包含报文数据缓冲区的内存结构。 - 定时器管理(librte_timer):用于在DPDK应用程序中实现定时功能。 DPDK还支持以太网轮询模式驱动...
`The Chain`在这里指的是“mbuf链”,这是许多操作系统(如FreeBSD、OpenBSD等)中用于存储网络数据包的一种内存管理机制。mbuf(memory buffer)是一种数据结构,用于暂时存放网络层和传输层的数据单元,如IP数据包...
Invalid Mbuf Pointer(亲测可用).md
Invalid Mbuf Chain(亲测可用).md
提到的“mbuf”是Berkeley套接字实现中的一种内存管理机制。在处理网络数据时,数据通常以任意大小的块到达,而mbuf设计用于动态存储这些数据块。它是一种高效的数据结构,允许快速地分配和重组内存,以便处理不同...
另外,mbuf机制减少了协议头构建时的内存拷贝操作,提高了数据传输的效率。 在编程层面,程序员通常使用select、poll或epoll等系统调用来监控socket的状态,这样可以非阻塞地等待数据的到来,从而实现高效的网络...
socket本身没什么,主要依存下层的运输层协议TCP、UDP,其中调用TCP的socket是精华所在,这个版本集合了TCP,UDP所要用到的socket,网络层之间传输运用mbuf。这是对前面几个版本的集成~~