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

📄 uciocpbuffer.pas

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

interface

uses
  Windows, WinSock2, uCriticalSection, uDIProtocol, uIOCPRTL;

type
  IOEventType = (
    IOInitialize,				              //初始化状态
	  IOWSAAcceptEx,				            //AcceptEx事件投递
	  IOWSARecv,					              //接收事件投递
	  IOWSASend,					              //发送事件
	  IOWSACloseSocket			            //关闭事件
  );

  TAbstractContext = class;

  //Overlapped结构扩展
  PPerHandleData = ^TPerHandleData;
  TPerHandleData = packed record
    m_overlap: OVERLAPPED;    //重叠
    Buffer: array [0..MAX_PACKAGESIZE - 1] of Char; //用户缓冲
    pPerIOBuf: Pointer;       //per-I/O的指针
  end;

  //per-I/O数据。它包含了在套节字上处理I/O操作的必要信息
  TAbstractBuffer = Class
  private
    m_socket: TSocket;
  public
    function GetSequenceNumber: DWORD;              //获取响应顺序号
    procedure SetSequenceNumber(m_iValue: DWORD);   //设置响应顺序号
    function GetOperation: IOEventType;             //获取操作类型
    procedure SetOperation(OP: IOEventType);				//设置操作类型

    procedure SetupZeroByteRead;                    //设置m_wsabuf.buf指向m_pBuffer指针
                                                    //及m_wsabuf.len长度为零
	  procedure SetupWrite;						                //设置m_wsabuf.buf指向m_pBuffer指针
											                              //及m_wsabuf.len长度为m_nUsed
	  procedure SetupRead;						                //设置m_wsabuf.buf指向m_pBuffer指针

  private
    PerHandleData: TPerHandleData;                  //Overlapped结构扩展
    FWSABuf: WSABUF;                                //WSABUF
    Context: TAbstractContext;                      //per-Handle数据
  private
    FStartBuffer: Pointer;                          //缓冲区指针
    m_iSequenceNumber: DWORD;                       //序列号
    m_Operation: IOEventType;                       //操作类型
    m_nSize: DWORD;                                 //Buffer 大小
    m_nUsed: DWORD;                                 //Buffer多少已使用

  published
    property FPerHandleData: TPerHandleData read PerHandleData;
    property FSocket: TSocket read m_socket write m_socket;
    property _WSABuf: WSABUF read FWSABuf write FWSABuf;
  public
    constructor Create;
    destructor Destroy; override;
  end;

  //per-Handle数据。它包含了一个套节字的信息
  TAbstractContext = Class
  private
    m_Socket: TSocket;
    m_ContextLock: TCriticalSection;
    mRecvBuffer: TAbstractBuffer;
    mSendBuffer: TAbstractBuffer;
  public
    procedure InitContext;
  published
    property FSocket: TSocket read m_socket write m_socket;
    property FContextLock: TCriticalSection read m_ContextLock write m_ContextLock;
    property FRecvBuffer: TAbstractBuffer read mRecvBuffer write mRecvBuffer;
    property FSendBuffer: TAbstractBuffer read mSendBuffer write mSendBuffer;
  public
    constructor Create;
    destructor Destroy; override;
  end;


 
implementation

//TAbstractBuffer
constructor TAbstractBuffer.Create;
begin
  inherited Create;
  m_nSize := 0;
  m_nUsed := 0;
  m_Operation := IOInitialize;
  FillChar(PerHandleData.m_overlap, SizeOf(PerHandleData.m_overlap), 0);
  PerHandleData.pPerIOBuf := self;

  FWSABuf.buf := PerHandleData.Buffer;
  FWSABuf.len := MAX_PACKAGESIZE;
  FStartBuffer := @PerHandleData.Buffer;
end;

destructor TAbstractBuffer.Destroy;
begin
  inherited Destroy;
end;

function TAbstractBuffer.GetSequenceNumber: DWORD;
begin
  Result := m_iSequenceNumber;
end;

procedure TAbstractBuffer.SetSequenceNumber(m_iValue: DWORD);
begin
  m_iSequenceNumber := m_iValue;
end;

function TAbstractBuffer.GetOperation: IOEventType;
begin
  Result := m_Operation;
end;

procedure TAbstractBuffer.SetOperation(OP: IOEventType);
begin
  FillChar(PerHandleData.m_overlap, SizeOf(PerHandleData.m_overlap), 0);
  m_Operation := OP;
end;

procedure TAbstractBuffer.SetupZeroByteRead;
begin
  FWSABuf.buf := PerHandleData.Buffer;
  FWSABuf.len := 0;
end;

procedure TAbstractBuffer.SetupWrite;
begin
  FWSABuf.buf := PerHandleData.Buffer;
  FWSABuf.len := MAX_PACKAGESIZE;
end;

procedure TAbstractBuffer.SetupRead;
begin
  FWSABuf.buf := PerHandleData.Buffer;
  FWSABuf.len := MAX_PACKAGESIZE;
end;

//TAbstractContext
constructor TAbstractContext.Create;
begin
  inherited Create;
  mRecvBuffer := TAbstractBuffer.Create;
  mSendBuffer := TAbstractBuffer.Create;
  m_ContextLock := TCriticalSection.Create;
end;

destructor TAbstractContext.Destroy;
begin
  mRecvBuffer.Free;
  mSendBuffer.Free;
  m_ContextLock.Free;
  inherited Destroy;
end;

procedure TAbstractContext.InitContext;
begin

end;
end.

⌨️ 快捷键说明

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