123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #ifndef RVC_SPSHELL_IOCP_SOCKET_SERVER_H__
- #define RVC_SPSHELL_IOCP_SOCKET_SERVER_H__
- #pragma once
- #if defined(_MSC_VER)
- #include <WinSock2.h>
- #include <MSWSock.h>
- #include "AutoLock.h"
- #pragma comment(lib, "Ws2_32.lib")
- #endif /* RVC_OS_WIN */
- #include <string>
- #include <map>
- using namespace std;
- class CIOCPSocketServer
- {
- #if defined(_MSC_VER)
- private:
- struct ConnectionContext;
- struct OperationContext;
- #endif /* RVC_OS_WIN */
- public:
- CIOCPSocketServer(int nMaxWorkThreadNum =0);
- virtual ~CIOCPSocketServer(void);
- #if defined(_MSC_VER)
- 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;
- #endif /* RVC_OS_WIN */
- };
- #endif //RVC_SPSHELL_IOCP_SOCKET_SERVER_H__
|