mbufメカニズムを模倣して独自の不定長メモリプールを実現


最近、クライアントの下部通信モジュールの実現問題を考えています.私がしなければならないのは、私のソケットをウィンドウにバインドすることです.ソケットにイベントが発生したとき、例えば読み取り可能、閉じるなどのメッセージがあるとき、直接ウィンドウメッセージを通じて私に知らせてください.私は一定の処理をしています.クライアントは伸縮可能なメモリプールを実現して通信のデータを管理する必要があります.上位層は1フレームに多くの送信対象データを圧入することができ、下位層は1フレームに多くのサーバ側のデータを受け入れることができる.だから私は長くなるメモリプールを使って実現するつもりで、以前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  : [email protected] 
* 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();
};
この方法はとても良いと感じて、もちろん、もし各位の友达がもっと良い提案あるいは意见があるならば、私に连络することを歓迎します^^;)