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();
};
この方法はとても良いと感じて、もちろん、もし各位の友达がもっと良い提案あるいは意见があるならば、私に连络することを歓迎します^^;)