IOCPSocketServer.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. #include <WinSock2.h>
  3. #include <MSWSock.h>
  4. #include "AutoLock.h"
  5. #include <string>
  6. #include <map>
  7. using namespace std;
  8. #pragma comment(lib, "Ws2_32.lib")
  9. class CIOCPSocketServer
  10. {
  11. private:
  12. struct ConnectionContext;
  13. struct OperationContext;
  14. public:
  15. CIOCPSocketServer(int nMaxWorkThreadNum =0);
  16. virtual ~CIOCPSocketServer(void);
  17. bool WinSockStartup();
  18. bool WinSockCleanup();
  19. bool StartListen(int nPort);
  20. bool StopListen();
  21. bool AsyncSend(int nConnectionID, char *pData, int nSendLen);
  22. bool CloseConnection(int nConnectionID);
  23. const char* GetLastErrorMsg(int nErrorCode =0);
  24. protected:
  25. virtual void OnAccepte(int nConnectionID, const char *pRemoteAddr, int nPort){}
  26. virtual void OnSend(int nConnectionID, int nSendLen){}
  27. virtual void OnReceive(int nConnectionID, char *pData, int nRecvLen){}
  28. virtual void OnClose(int nConnectionID){}
  29. private:
  30. CIOCPSocketServer(const CIOCPSocketServer &rhs);
  31. CIOCPSocketServer& operator=(const CIOCPSocketServer &rhs);
  32. ConnectionContext* GetConnectionContext(int nConnectionID);
  33. bool AsyncAccept();
  34. void ProcessAcceptCompleted(OperationContext *pOperationContext);
  35. void ProcessSendCompleted(OperationContext *pOperationContext, int nByteLen);
  36. void ProcessReceiveCompleted(OperationContext *pOperationContext, int nByteLen);
  37. static UINT _stdcall WorkThreadFunc(void *pArg);
  38. bool PollCompletionPort();
  39. int GetProcessorNum();
  40. DWORD GetConnectTime(SOCKET hSocket);
  41. bool IsConnected(SOCKET hSocket);
  42. size_t GetAddressSize() const;
  43. bool SetNoLinger(SOCKET hSocket);
  44. bool LoadExtensionFunction(SOCKET s, GUID functionID, void **ppFunc);
  45. private:
  46. DWORD m_dwSerialNo;
  47. bool m_bExit;
  48. bool m_bStarted;
  49. CLockObject m_LockObject;
  50. HANDLE m_hIOCP;
  51. SOCKET m_hListenSocket;
  52. OperationContext *m_pAcceptContext;
  53. LPFN_ACCEPTEX m_fnAcceptEx;
  54. LPFN_GETACCEPTEXSOCKADDRS m_fnGetAcceptExSocketAddrs;
  55. int m_nMaxWorkThreadNum;
  56. int m_nThreadCount;
  57. HANDLE *m_pWorkThreads;
  58. string m_strLastErrMsg;
  59. map<DWORD, ConnectionContext*> m_ConnectionContext;
  60. };