#pragma once #include #include #include "ConcurrentQueue.h" #ifdef BUILD_COMMDLL #define COMMDLL_DLLCLASS __declspec(dllexport) #else #define COMMDLL_DLLCLASS __declspec(dllimport) #endif class IBufferSocketCallBack { public: virtual void OnReceive(const char *buffer, int len) = 0; virtual void OnDisconnect(int errorCode) = 0; }; class COMMDLL_DLLCLASS CBufferedSocket { // Forward declaration of internal classes public: class CBufferedSocketMessage; class CBufferMessageThread; class CReceivingThread; class CSenderThread; class CInternalMessageThread; friend class CInternalMessageThread; friend class CReceivingThread; friend class CSenderThread; // Private fields private: CConcurrentQueue *m_pMessageQueue; CConcurrentQueue *m_pSendQueue; CBufferMessageThread *m_pMessageThread; CBufferMessageThread *m_PSenderThread; IBufferSocketCallBack *m_pCallBack; CReceivingThread *m_pReceivingThread; CEvt *m_hConnectedEvent; SOCKET s; bool bIsConnected; // Private methods protected: void OnReceive(const char* buf, size_t len); void OnDisconnect(int errorCode); int Read(char *buf, size_t size); int Write(const char* buf, size_t len); private: CBufferedSocket(const CBufferedSocket&); // Public methods public: CBufferedSocket(IBufferSocketCallBack *pCallBack); ~CBufferedSocket(void); void ProcessMessage(CBufferedSocketMessage &message); void Close(); bool Connect(const char* IpAddress, int port); bool Send(const char* buf, size_t len, int milliSeconds = INFINITE); bool IsConnected() { return bIsConnected; } bool WaitConnected(); bool WaitConnected(int milliseconds); /* returns the percentage representing how full the send queue is */ double SendQueueFullState(); };