1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #pragma once
- #include <WinSock2.h>
- #include <MSWSock.h>
- #include "AutoLock.h"
- #include <string>
- #include <map>
- using namespace std;
- #pragma comment(lib, "Ws2_32.lib")
- class CIOCPSocketServer
- {
- private:
- struct ConnectionContext;
- struct OperationContext;
- public:
- CIOCPSocketServer(int nMaxWorkThreadNum =0);
- virtual ~CIOCPSocketServer(void);
- bool WinSockStartup();
- bool WinSockCleanup();
- bool StartListen(int nPort);
- bool StopListen();
-
- bool AsyncSend(int nConnectionID, char *pData, int nSendLen);
- bool CloseConnection(int nConnectionID);
- const char* GetLastErrorMsg(int nErrorCode =0);
- protected:
- virtual void OnAccepte(int nConnectionID, const char *pRemoteAddr, int nPort){}
- virtual void OnSend(int nConnectionID, int nSendLen){}
- virtual void OnReceive(int nConnectionID, char *pData, int nRecvLen){}
- virtual void OnClose(int nConnectionID){}
- private:
- CIOCPSocketServer(const CIOCPSocketServer &rhs);
- CIOCPSocketServer& operator=(const CIOCPSocketServer &rhs);
- ConnectionContext* GetConnectionContext(int nConnectionID);
- bool AsyncAccept();
- void ProcessAcceptCompleted(OperationContext *pOperationContext);
- void ProcessSendCompleted(OperationContext *pOperationContext, int nByteLen);
- void ProcessReceiveCompleted(OperationContext *pOperationContext, int nByteLen);
-
- static UINT _stdcall WorkThreadFunc(void *pArg);
- bool PollCompletionPort();
- int GetProcessorNum();
- DWORD GetConnectTime(SOCKET hSocket);
- bool IsConnected(SOCKET hSocket);
- size_t GetAddressSize() const;
- bool SetNoLinger(SOCKET hSocket);
- bool LoadExtensionFunction(SOCKET s, GUID functionID, void **ppFunc);
- private:
- DWORD m_dwSerialNo;
- bool m_bExit;
- bool m_bStarted;
- CLockObject m_LockObject;
- HANDLE m_hIOCP;
- SOCKET m_hListenSocket;
- OperationContext *m_pAcceptContext;
-
- LPFN_ACCEPTEX m_fnAcceptEx;
- LPFN_GETACCEPTEXSOCKADDRS m_fnGetAcceptExSocketAddrs;
- int m_nMaxWorkThreadNum;
- int m_nThreadCount;
- HANDLE *m_pWorkThreads;
- string m_strLastErrMsg;
- map<DWORD, ConnectionContext*> m_ConnectionContext;
- };
|