⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udisocketserver.pas

📁 楠楠写的DBiocp例子都是源码
💻 PAS
字号:
unit uDISocketServer;

interface

uses
  Windows, Sysutils, WinSock2, uWinSocket, uCriticalSection, uIOCompletionPort, uDIProtocol,
  uDIBuffer, uDIClientContext, uDIPoolClientContext, uDIMonitor, uDIMapClientContext;
  {$I IOCP.inc}
  
type
  TOnSocketEvent = procedure(FClientContext: TDIClientContext) of object;
  TOnSocketIOEvent = procedure(FClientContext: TDIClientContext; FDIBuffer: TDIBuffer; dwIoSize: DWORD) of object;

  TDISocketServer = Class
  protected
    m_nPort:                        Integer;                //端口号
    m_sListen:                      TSocket;                //Socket监听端口
    m_ServerType:                   TServerStartType;       //服务器类型

    m_bShutDown:                    Boolean;                //是否停止服务
    m_bServerStarted:               Boolean;                //服务器是否启动
    m_bAcceptConnections:           Boolean;                //是否允许客户端连接

    m_iMaxNumConnections:           DWORD;                  //允许最多客户端连接个数
    m_iMaxNumberOfFreeContext:      DWORD;                  //空闲上下文池允许的最大数
    m_iMaxNumberOfFreeBuffer:       DWORD;                  //空闲Buufer池允许的最大数
    m_iNumberOfActiveConnections:   Integer;                //当前客户端连接个数

    m_WinSocket:                    TWinSocket;             //Socket底层函数
    m_IOCompletionPort:             TIOCompletionPort;      //完成端口(外部创建)
    m_PoolClientContext:            TDIPoolClientContext;   //上下文回收池
    m_MapClientContext:             TDIMapClientContext;    //上下文管理
    m_MapClientContextLock:         TCriticalSection;       //上下文管理锁
    m_SocketServerLock:             TCriticalSection;       //锁

  published
    property FPort: Integer read m_nPort write m_nPort;
    property FWinSocket: TWinSocket read m_WinSocket write m_WinSocket;
    property FIOCompletionPort: TIOCompletionPort read m_IOCompletionPort write m_IOCompletionPort;
    property FPoolClientContext: TDIPoolClientContext read m_PoolClientContext;
    property FMapClientContext: TDIMapClientContext read m_MapClientContext;
    property FMapClientContextLock: TCriticalSection read m_MapClientContextLock write m_MapClientContextLock;
    property FSocketServerLock: TCriticalSection read m_SocketServerLock write m_SocketServerLock;

  private
    FOnNewSocketEvent:              TOnSocketEvent;         //客户端连接
    FOnCloseSocketEvent:            TOnSocketEvent;         //客户端关闭
    FOnRecvCompletedEvent:          TOnSocketIOEvent;       //接受客户端消息
    FOnSendCompletedEvent:          TOnSocketIOEvent;       //发送客户端消息

  published
    property OnNewSocketEvent: TOnSocketEvent read FOnNewSocketEvent write FOnNewSocketEvent;
    property OnCloseSocketEvent: TOnSocketEvent read FOnCloseSocketEvent write FOnCloseSocketEvent;
    property OnRecvCompletedEvent: TOnSocketIOEvent read FOnRecvCompletedEvent write FOnRecvCompletedEvent;
    property OnSendCompletedEvent: TOnSocketIOEvent read FOnSendCompletedEvent write FOnSendCompletedEvent;

  published
    procedure DisconnectAllClient; virtual; abstract;
    procedure KillDeadClientSocket; virtual; abstract;
    //新加上下文到Map
    function AddClientContext(FClientContext: TDIClientContext): Boolean; virtual; abstract;
    //关闭socket,把上下文从Map中移出
    procedure DisconnectClient(FClientContext: TDIClientContext); virtual; abstract;
    //释放上下文
    function ReleaseClientContext(FClientContext: TDIClientContext): Boolean; virtual; abstract;
    procedure AppendDisplayMsg(sMsg: String); virtual; abstract;
    procedure AppendLogMessage(sMsg: String); virtual; abstract;
    procedure AppendErrorLogMessage(sMsg: String); virtual; abstract;
  public
    function StartServe( nPort: Integer;
                         iMaxNumConnections: DWORD;
                         iMaxNumberOfFreeContext: DWORD;
                         iMaxNumberOfFreeBuffer: DWORD;
                         StartType: TServerStartType = IOServerStart ): Boolean; virtual; abstract;
		procedure StopServer; virtual; abstract;
    function Connect(strIPAddr: String; nPort: DWORD): Boolean; virtual; abstract;

    procedure ProcessFreeMemory; virtual; abstract;
    procedure ProcessIOError(FClientContext: TDIClientContext; FIOEventType: IOEventType; IOErrorType: TIOErrorType); virtual; abstract;
    procedure ProcessIOMessage(IOType: IOEventType; FClientContext: TDIClientContext; FBuffer: TDIBuffer; dwIoSize: DWORD); virtual; abstract;

  public
    constructor Create(IOCompletionPort: TIOCompletionPort);
    destructor Destroy; override;
  end;

implementation
 
//TDISocketServer
constructor TDISocketServer.Create(IOCompletionPort: TIOCompletionPort);
 begin
  inherited Create;
  m_WinSocket := TWinSocket.Create;
  m_IOCompletionPort := IOCompletionPort;
  m_PoolClientContext := TDIPoolClientContext.Create;
  m_MapClientContext := TDIMapClientContext.Create;
  m_MapClientContextLock := TCriticalSection.Create;
  m_SocketServerLock := TCriticalSection.Create;
end;

destructor TDISocketServer.Destroy;
begin
  StopServer;
  FreeAndNil(m_WinSocket);
  FreeAndNil(m_PoolClientContext);
  FreeAndNil(m_MapClientContext);
  FreeAndNil(m_MapClientContextLock);
  FreeAndNil(m_SocketServerLock);
  inherited Destroy;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -