Files
2022-10-26 12:25:11 +08:00

106 lines
3.4 KiB
C++

#ifndef __WBANetwork_ServerSession_H
#define __WBANetwork_ServerSession_H
#include <WBANetwork/util//EventQueue.h>
#include <WBANetwork/util//CircuitQueue.h>
#include <WBANetwork/util//Stream.h>
#include <WBANetwork/util//Mutex.h>
#include <WBANetwork/net/Socket.h>
#include <WBANetwork/util/AsyncResult.h>
namespace WBANetwork
{
enum SEND_RET {SUCESS, FAILD_OVERFLOW, FAILD_CLOSED, FAILD_NULL};
class ServerNetwork;
class ServerSession : public EventHandler
{
friend class SessionManager;
public:
ServerSession( int sendBufSize, int recvBufSize );
virtual ~ServerSession();
// Derived virtual function
virtual void HandleEvent( AsyncResult* result );
virtual Socket* GetHandle() { return &m_Socket; }
virtual char* GetBuffer() { return 0; }
virtual int GetBufferSize() { return 0; }
void Flush();
void Create();
void Create( SOCKET s, Socket::SocketAddr& addr );
void Close();
DWORD SetKeepAlive(u_long onoff, u_long KeepaliveTime, u_long Keepaliveinterval);
void Connect( TCHAR* ipAddress, unsigned short portNo );
void SetKill( DWORD err = 0 );
//bool CompulsionSendPacket( PBYTE buffer, int length, AsyncResult* result );
void SendPacket( void* buffer, int size, SEND_RET& ret );
virtual bool SendPacket( void* buffer, int size );
virtual bool SendPacket( Stream& stream );
TCHAR* GetIPAddress() { return m_Socket.GetIPAddress(); }
DWORD GetUID() { return m_UID; }
PBYTE GetSendBuffer() { return m_CQSendBuffer.GetReadPtr(); }
PBYTE GetRecvBuffer() { return m_CQRecvBuffer.GetWritePtr(); }
DWORD GetNextSendSize() { return m_CQSendBuffer.GetReadableSize(); }
void GetSendBufferSize( DWORD* remain, DWORD* max );
void GetRecvBufferSize( DWORD* remain, DWORD* max );
DWORD GetSendReadableSize() { return m_CQSendBuffer.GetReadableSize(); }
DWORD GetSendWritableSize() { return m_CQSendBuffer.GetWritableSize(); }
DWORD GetRecvReadableSize() { return m_CQRecvBuffer.GetReadableSize(); }
DWORD GetRecvWritableSize() { return m_CQRecvBuffer.GetWritableSize(); }
void SetMPU( DWORD size ) { m_dwMaxSizePerUpdate = size; }
DWORD GetMPU() { return m_dwMaxSizePerUpdate; }
AsyncResult m_AResultAccept, m_AResultConnect, m_AResultClose;
AsyncResult m_AResultSend, m_AResultRecv;
protected:
// Member virtual function
virtual void OnAccept() {}
virtual void OnConnect( bool /*success*/, DWORD /*error*/ ) {}
virtual void OnSend( int /*size*/ ) {}
virtual void OnReceive( PBYTE /*buffer*/, int /*size*/ ) {}
virtual void OnClose( DWORD /*error*/ ) {}
virtual void Update();
virtual bool IsValidPacket( PBYTE ptr, DWORD recvBytes, DWORD* totalSize )
{
*totalSize = *( DWORD* )ptr;
return ( recvBytes >= *totalSize );
}
private:
void Clear();
void WaitForRecv();
DWORD m_UID;
Socket m_Socket;
CircuitQueue < BYTE > m_CQSendBuffer;
CircuitQueue < BYTE > m_CQRecvBuffer;
PBYTE m_szDequeueBuffer;
bool m_bReadyToSend;
DWORD m_dwSendBufSize;
DWORD m_dwRecvBufSize;
DWORD m_dwSendReqSize;
DWORD m_dwSendCompletionSize;
DWORD m_dwMaxSizePerUpdate;
ServerNetwork* m_pServerNetwork;
Mutex m_MutexSend, m_MutexRecv;
};
}
#endif