www.pudn.com > 221315556.rar > ClientSocket.h
#pragma once
#include "socket.h"
#include "basethread.h"
#include "public.h"
#include "support.h"
/*
class CSimpleMsgQueue
{
public:
BOOL SaveMsg( char * msgbuf, int len )
{
int leftlen = 0;
int continuelen = 0;
if( len <= 0 )
return FALSE;
if( m_Putptr >= m_Getptr )
{
continuelen = MAXCLIENTBUFFER - m_Putptr;
leftlen = continuelen + m_Getptr;
if( len > leftlen )
return FALSE;
if( len > continuelen )
{
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, continuelen );
memcpy( this->m_MsgBuffer, msgbuf, len - continuelen );
}
else
{
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len );
}
}
else
{
continuelen = m_Getptr - m_Putptr;
leftlen = continuelen;
if( len > leftlen )
return FALSE;
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len );
}
m_Putptr = (m_Putptr + len) % MAXCLIENTBUFFER;
//printf( "Put msg put = %d get = %d\n", m_Putptr, m_Getptr );
return TRUE;
};
BOOL GetMsg( SCMSG * pmsg )
{
int leftlen = 0;
char * buf = (char *)pmsg;
int continuelen = 0;
if( m_Getptr == m_Putptr )
return FALSE;
if( m_Putptr > m_Getptr )
{
continuelen = m_Putptr - m_Getptr;
leftlen = continuelen;
if( MSGLENGTH > leftlen )
return FALSE;
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], MSGLENGTH );
}
else
{
continuelen = MAXCLIENTBUFFER - m_Getptr;
leftlen = m_Putptr + continuelen;
if( MSGLENGTH > leftlen )
return FALSE;
if( MSGLENGTH > continuelen )
{
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], continuelen);
memcpy( (void*)&buf[continuelen], (void*)this->m_MsgBuffer, MSGLENGTH - continuelen );
}
else
{
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], MSGLENGTH );
}
}
m_Getptr = (m_Getptr + MSGLENGTH) % MAXCLIENTBUFFER;
return TRUE;
};
VOID Clean()
{
m_Getptr = 0;
m_Putptr = 0;
}
CSimpleMsgQueue()
{
m_Getptr = 0;
m_Putptr = 0;
};
~CSimpleMsgQueue()
{
};
private:
UINT m_Getptr;
UINT m_Putptr;
CHAR m_MsgBuffer[MSGLENGTH * 1024];
};
*/
#ifndef CSSMsgQueue
class CSSMsgQueue2
{
public:
CSSMsgQueue2()
{
m_Getptr = 0;
m_Putptr = 0;
};
virtual ~CSSMsgQueue2()
{
};
BOOL Clean()
{
m_Getptr = 0;
m_Putptr = 0;
return TRUE;
};
BOOL SaveMsg( char * msgbuf, int len )
{
int leftlen = 0;
int continuelen = 0;
if( len <= 0 )
return FALSE;
if( m_Putptr >= m_Getptr )
{
continuelen = MAXSERVERBUFFER - m_Putptr;
leftlen = continuelen + m_Getptr;
if( len > leftlen )
return FALSE;
if( len > continuelen )
{
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, continuelen );
memcpy( this->m_MsgBuffer, msgbuf, len - continuelen );
}
else
{
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len );
}
}
else
{
continuelen = m_Getptr - m_Putptr;
leftlen = continuelen;
if( len > leftlen )
return FALSE;
memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len );
}
m_Putptr = (m_Putptr + len) % MAXSERVERBUFFER;
//printf( "Put msg put = %d get = %d\n", m_Putptr, m_Getptr );
return TRUE;
};
BOOL GetMsg( SSMSG * pmsg )
{
int leftlen = 0;
char * buf = (char *)pmsg;
int continuelen = 0;
if( m_Getptr == m_Putptr )
return FALSE;
if( m_Putptr > m_Getptr )
{
continuelen = m_Putptr - m_Getptr;
leftlen = continuelen;
if( SSMSGLENGTH > leftlen )
return FALSE;
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], SSMSGLENGTH );
}
else
{
continuelen = MAXSERVERBUFFER - m_Getptr;
leftlen = m_Putptr + continuelen;
if( SSMSGLENGTH > leftlen )
return FALSE;
if( SSMSGLENGTH > continuelen )
{
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], continuelen);
memcpy( (void*)&buf[continuelen], (void*)this->m_MsgBuffer, SSMSGLENGTH - continuelen );
}
else
{
memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], SSMSGLENGTH );
}
}
m_Getptr = (m_Getptr + SSMSGLENGTH) % MAXSERVERBUFFER;
return TRUE;
};
private:
UINT m_Getptr;
UINT m_Putptr;
CHAR m_MsgBuffer[SSMSGLENGTH * 1024];
};
#endif
class CClientSocketThread:public CBaseThread
{
protected:
char m_recvBuffer[2048];
DWORD Proc( LPVOID lpParam );
};
#define GAMECLIENTMODE 0
#define GAMESERVERMODE 1
#define THREAD_SOCKET 0
#define MANUAL_SOCKET (1<<16)
class CClientSocket
{
friend class CClientSocketThread;
public:
CClientSocket(void);
CClientSocket( int mode );
virtual ~CClientSocket(void);
protected:
SOCKET m_sClient;
CSocket m_socket;
CClientSocketThread * m_pClientThread;
int m_Mode;
// DWORD m_dwFlag;
private:
CSimpleMsgQueue * m_pMsgQueue;
CSSMsgQueue2 * m_pSSMsgQueue;
char m_recvBuffer[2048];
public:
// 连接服务器
BOOL Connect(const char * IpAddress, const unsigned int Port);
// 断开连接
BOOL Disconnect(void);
// 清除消息队列存储区
virtual BOOL CleanBuffer(void);
virtual BOOL SendMsg(SSMSG*);
virtual BOOL GetMsg( SSMSG*);
// 取得一个消息
virtual BOOL GetMsg(SCMSG* pmsg);
// 发送一个消息
virtual BOOL SendMsg(SCMSG* pmsg);
virtual BOOL IsConnected(void);
virtual BOOL SaveMsg(CHAR * pBuffer , int nSize);
virtual BOOL Update();
};