/************************************************************************* 【文件名】 NetServer.h 【功能模块和目的】 网络服务器端类头文件 【开发者及日期】 郑石诺 2015/07/19 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once #include "socketbase.h" /************************************************************************* 【类名】 CNetServer 【功能】 【接口说明】 网络服务器端类 【开发者及日期】 郑石诺 2015/07/19 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ class CNetServer : public CSocketBase { private: typedef struct tagPER_IO_CONTEXT { OVERLAPPED m_Overlapped; // 每一个重叠网络操作的重叠结构(针对每一个Socket的每一个操作,都要有一个) SOCKET m_sockAccept; // 这个网络操作所使用的Socket WSABUF m_wsaBuf; // WSA类型的缓冲区,用于给重叠操作传参数的 char m_szBuffer[PDU_MAX_DATA_LEN]; // 这个是WSABUF里具体存字符的缓冲区 tagPER_IO_CONTEXT() { ZeroMemory(&m_Overlapped, sizeof(m_Overlapped)); ZeroMemory( m_szBuffer, PDU_MAX_DATA_LEN ); m_sockAccept = INVALID_SOCKET; m_wsaBuf.buf = m_szBuffer; m_wsaBuf.len = PDU_MAX_DATA_LEN; } ~tagPER_IO_CONTEXT() { if( m_sockAccept != INVALID_SOCKET ) { shutdown(m_sockAccept, SD_BOTH); closesocket(m_sockAccept); m_sockAccept = INVALID_SOCKET; } } void resetBuffer() { ZeroMemory( m_szBuffer, PDU_MAX_DATA_LEN ); } } PER_IO_CONTEXT, *PPER_IO_CONTEXT; public: CNetServer(CNetLinkMain* pParent); virtual ~CNetServer(void); bool create(int a_ListenPort); bool isAlive(void) { return true; } void onDisconnect(void) { } void doJob(OVERLAPPED* pOverLapped, DWORD BytesTransfered); private: PPER_IO_CONTEXT __newIoContext(void); void __deleteIoContext(PPER_IO_CONTEXT pIoContext); bool __postAccept(PPER_IO_CONTEXT pIoContext); private: CArray m_ArrayIoContext; LPFN_ACCEPTEX m_lpfnAcceptEx; LPFN_GETACCEPTEXSOCKADDRS m_lpfnGetAcceptExSockAddrs; };