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

📄 uditcpcircularpacketsocketserver.pas

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

interface

uses
  Windows, Sysutils, uDIBuffer, uIOCompletionPort, uDIClientContext, uDIProtocol,
  uDIIocpTcpServer;
  {$I IOCP.inc}

type
  TDITcpCircularPacketSocketServer = class(TDIIocpTcpServer)
  private
    procedure NewSocketEvent(FClientContext: TDIClientContext);
    procedure CloseSocketEvent(FClientContext: TDIClientContext);
    procedure RecvCompletedEvent( FClientContext: TDIClientContext;
                                  FDIBuffer: TDIBuffer;
                                  dwIoSize: DWORD );
    procedure SendCompletedEvent( FClientContext: TDIClientContext;
                                  FDIBuffer: TDIBuffer;
                                  dwIoSize: DWORD );

    procedure ProcessDataStream( FClientContext: TDIClientContext;
                                 FDIBuffer: TDIBuffer;
                                 dwIoSize: DWORD );
  public
    procedure ReadEchoPackage(FDIBuffer: TDIBuffer);
    procedure WriteEchoPackage(FDIBuffer: TDIBuffer);
  published
    procedure AppendDisplayMsg(sMsg: String); override;
    procedure AppendLogMessage(sMsg: String); override;
    procedure AppendErrorLogMessage(sMsg: String); override;
    procedure SendMsgToAll;
  public
    constructor Create(IOCompletionPort: TIOCompletionPort);
    destructor Destroy; override;
  end;

implementation
  uses crc16, uDIMonitor, uFileLogger;

constructor TDITcpCircularPacketSocketServer.Create(IOCompletionPort: TIOCompletionPort);
begin
  inherited Create(IOCompletionPort);
  OnNewSocketEvent := NewSocketEvent;
  OnCloseSocketEvent := CloseSocketEvent;
  OnRecvCompletedEvent := RecvCompletedEvent;
  OnSendCompletedEvent := SendCompletedEvent;
end;

destructor TDITcpCircularPacketSocketServer.Destroy;
begin
  inherited Destroy;
end;

procedure TDITcpCircularPacketSocketServer.AppendDisplayMsg(sMsg: String);
begin

end;

procedure TDITcpCircularPacketSocketServer.AppendLogMessage(sMsg: String);
begin
  _FileLogger.WriteLogMsg(sMsg);
end;

procedure TDITcpCircularPacketSocketServer.AppendErrorLogMessage(sMsg: String);
begin
  _FileLogger.WriteLogMsg(sMsg);
end;

procedure TDITcpCircularPacketSocketServer.NewSocketEvent(FClientContext: TDIClientContext);
begin
  {$IFDEF _ICOP_DEBUG}
      AppendLogMessage('新客户端连接, IP地址:'+FClientContext.FRemoteIP+
                       ' Socket ID: '+ IntToStr(FClientContext.m_KeyID)+
                       ' m_iNumberOfActiveConnections:'+IntToStr(m_iNumberOfActiveConnections));
  {$ENDIF}
end;

procedure TDITcpCircularPacketSocketServer.CloseSocketEvent(FClientContext: TDIClientContext);
begin
  {
  AppendDisplayMsg('客户端关闭, IP地址:'+GetRemoteIPAddr(FClientContext.FRemoteAddr)+
                           ' Socket ID:'+ IntToStr(FClientContext.m_KeyID));  }
end;

procedure TDITcpCircularPacketSocketServer.RecvCompletedEvent( FClientContext: TDIClientContext;
                                                           FDIBuffer: TDIBuffer;
                                                           dwIoSize: DWORD );
begin
  {$IFDEF _IOCP_MONITOR}
      _DIMonitor.AddRecvByte(dwIoSize);
  {$ENDIF}

  //设置socket
  FClientContext.FContextLock.Lock;
  FDIBuffer.m_Socket := FClientContext.FSocket;
  FClientContext.FContextLock.UnLock;
  
  //处理数据
  ProcessDataStream(FClientContext, FDIBuffer, dwIoSize);
  //投递下一个Buffer
  PostWSARecv(FClientContext);
end;

procedure TDITcpCircularPacketSocketServer.SendCompletedEvent( FClientContext: TDIClientContext;
                                                     FDIBuffer: TDIBuffer;
                                                     dwIoSize: DWORD );
begin
  {$IFDEF _IOCP_MONITOR}
      _DIMonitor.AddSendByte(dwIoSize);
  {$ENDIF}

  if FDIBuffer.GetUsed = dwIoSize then begin
//    {$IFDEF _ICOP_DEBUG}
//        AppendLogMessage('SendCompletedEvent投递完成! Key : '+IntToStr(FClientContext.m_KeyID));
//    {$ENDIF}
  end
  else
  begin
    {$IFDEF _ICOP_DEBUG}
        AppendLogMessage('SendCompletedEvent尚未完成! Key : '+IntToStr(FClientContext.m_KeyID));
    {$ENDIF}
  end;
end;


procedure TDITcpCircularPacketSocketServer.ProcessDataStream( FClientContext: TDIClientContext;
                                                          FDIBuffer: TDIBuffer;
                                                          dwIoSize: DWORD );
begin
  {
  FClientContext.FContextLock.Lock;
  //读数据包
  ReadEchoPackage(FDIBuffer);

  FClientContext.SendBuffer.InitBuffer;
  CopyMemory( Pointer(FClientContext.SendBuffer.GetBuffer),
              Pointer(FDIBuffer.GetBuffer),
              FDIBuffer.GetUsed );
  FClientContext.SendBuffer.SetUsed(FDIBuffer.GetUsed);
  FClientContext.FContextLock.UnLock;

  PostWSASend(FClientContext);
  }
end;

procedure TDITcpCircularPacketSocketServer.ReadEchoPackage(FDIBuffer: TDIBuffer);
begin

end;


procedure TDITcpCircularPacketSocketServer.WriteEchoPackage(FDIBuffer: TDIBuffer);
begin
 
end;

procedure TDITcpCircularPacketSocketServer.SendMsgToAll;
var
  m_pFreeClientContext: TDIClientContext;
  m_pNextClientContext: TDIClientContext;
begin
  FMapClientContextLock.Lock;

  //取单链表头
  m_pFreeClientContext := FMapClientContext.FClientContextList;
  m_pNextClientContext := nil;
    
  while (m_pFreeClientContext<> nil) do begin
    m_pNextClientContext := m_pFreeClientContext.m_pNext;

    m_pFreeClientContext.FContextLock.Lock;
    m_pFreeClientContext.SendBuffer.m_Socket := m_pFreeClientContext.m_Socket;
    //WriteEchoPackage(m_pFreeClientContext.SendBuffer);
    m_pFreeClientContext.FContextLock.UnLock;

    PostWSASend(m_pFreeClientContext);
    m_pFreeClientContext := m_pNextClientContext;
  end;

  FMapClientContextLock.UnLock;
end;


end.

⌨️ 快捷键说明

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