#pragma once #include #include #include #include "Server.h" class IOCPUDPServer : public Server { struct IO_CONTEXT { OVERLAPPED ol = {}; CONTEXT_UDP* pContext = nullptr; IO_CONTEXT() : ol({}), pContext(new CONTEXT_UDP) { } ~IO_CONTEXT() { SAFE_DELETE(pContext); } }; public: IOCPUDPServer(); ~IOCPUDPServer(); int GetPort() const override { return m_port; } UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) override; BOOL Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) override; VOID Destroy() override; virtual void UpdateMaxConnection(int maxConn) override { m_locker.lock(); m_maxConn = maxConn; m_locker.unlock(); } private: void WorkerThread(); void PostRecv(); IO_CONTEXT* AddCount() { m_locker.lock(); if (m_count > m_maxConn) { m_locker.unlock(); return nullptr; } IO_CONTEXT* ioCtx = new IO_CONTEXT(); ioCtx->pContext->InitMember(m_socket, this); m_count++; m_locker.unlock(); return ioCtx; } void DelCount() { m_locker.lock(); m_count--; m_locker.unlock(); } int GetCount() { m_locker.lock(); int n = m_count; m_locker.unlock(); return n; } private: int m_maxConn = 10000; int m_port = 6543; int m_count = 0; CLocker m_locker; SOCKET m_socket = INVALID_SOCKET; HANDLE m_hIOCP = NULL; HANDLE m_hThread = NULL; bool m_running = false; pfnNotifyProc m_notify = nullptr; pfnOfflineProc m_offline = nullptr; };