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

📄 udibuffer.pas

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

interface

uses
  Windows, WinSock2, SysUtils, StrUtils, uDIProtocol;

type

  //per-I/O
  TDIBuffer = Class
  public
    m_Socket:           TSocket;                    //Socket
    FWSABuf:            WSABUF;                     //WSABuf
    m_pNext:            TDIBuffer;                  //指向下一个DIBuffer
    PerHandleData:      TPerHandleData;             //Overlapped结构扩展
  protected
    m_iSequenceNumber:  DWORD;                      //序列号
    FStartBuffer:       Pointer;                    //缓冲区指针
    m_nSize:            DWORD;                      //Buffer 大小
    m_nUsed:            DWORD;                      //Buffer多少已使用
    Buffer: array [0..MAX_PACKAGESIZE - 1] of Byte; //用户缓冲
  private
                                                    //写数据到Buffer
    function AddData(pData: PByte; nSize: Word): Boolean; overload;
    function AddData(data: Byte): Boolean; overload;
    function AddData(data: WORD): Boolean; overload;
  public
    function CreatePackage(sTxt: String): Boolean;  overload;             //数据打包
    function CreatePackage(pData: PByte; nSize: Word): Boolean; overload; //数据打包
    procedure CreateTestPackage;                    //数据打包

    function GetBuffer: PByte;                      //得到Buffer
    function GetSequenceNumber: DWORD;              //获取响应顺序号
    procedure SetSequenceNumber(m_iValue: DWORD);   //设置响应顺序号
    function GetOperation: IOEventType;             //获取操作类型
    procedure SetOperation(IOType: 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指针

    procedure SetUsed(m_iUse: DWORD);               //设置Buffer使用大小
    function GetUsed: DWORD;                        //得到Buffer使用大小
  public
    procedure InitBuffer;                           //初始化DIBuffer
  public
    constructor Create;
    destructor Destroy; override;
  end;
  
implementation

constructor TDIBuffer.Create;
begin
  inherited Create;
  ZeroMemory(@PerHandleData.m_overlap, SizeOf(PerHandleData.m_overlap));
  PerHandleData.pDIBuffer := self;
  FWSABuf.buf := @Buffer[0];
  FWSABuf.len := MAX_PACKAGESIZE;
  InitBuffer;
end;

procedure TDIBuffer.InitBuffer;
begin
  m_nSize := 0;
  m_nUsed := 0;
  PerHandleData.m_overlap.Offset := DWord(IOInitialize);
  m_iSequenceNumber := 0;
  m_pNext := nil;
  m_Socket := INVALID_SOCKET;
  ZeroMemory(@Buffer[0], SizeOf(Buffer));
end;

destructor TDIBuffer.Destroy;
begin
  inherited Destroy;
end;

function TDIBuffer.GetBuffer: PByte;
begin
  Result := @Buffer[0];
end;

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

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

function TDIBuffer.GetOperation: IOEventType;
begin
  Result := IOEventType(PerHandleData.m_overlap.Offset);
end;

procedure TDIBuffer.SetOperation(IOType: IOEventType);
begin
  ZeroMemory(@PerHandleData.m_overlap, SizeOf(PerHandleData.m_overlap));
  PerHandleData.m_overlap.Offset := DWord(IOType);
end;

procedure TDIBuffer.SetupZeroByteRead;
begin
  FWSABuf.buf := @Buffer[0];
  FWSABuf.len := 0;
end;

procedure TDIBuffer.SetupWrite;
begin
  FWSABuf.buf := @Buffer[0];
  FWSABuf.len := m_nUsed;
end;

procedure TDIBuffer.SetupRead;
begin
  FWSABuf.buf := @Buffer[0];
  FWSABuf.len := MAX_PACKAGESIZE;
end;

procedure TDIBuffer.SetUsed(m_iUse: DWORD);
begin
  m_nUsed := m_iUse;
end;

function TDIBuffer.GetUsed: DWORD;
begin
  Result := m_nUsed;
end;

function TDIBuffer.AddData(pData: PByte; nSize: Word): Boolean;
begin
  if ( nSize > MAX_PACKAGESIZE -m_nUsed ) then
    Result := FALSE  
  else
  begin
    CopyMemory( Pointer(LongInt(GetBuffer)+m_nUsed),
                Pointer(LongInt(pData)),
                nSize );
    m_nUsed := m_nUsed+nSize;
    Result := TRUE;
  end;
end;

function TDIBuffer.AddData(data: Byte): Boolean;
begin
  Result := AddData(@data, 1);
end;

function TDIBuffer.AddData(data: WORD): Boolean;
begin
  Result := AddData(@data, SizeOf(WORD));
end;

function TDIBuffer.CreatePackage(sTxt: String): Boolean;
var
  nStrLen: Integer;
begin
  nStrLen := length(sTxt);
  if (nStrLen< MAX_PACKAGESIZE-1) and (nStrLen>0) then begin
	  m_nUsed := 0;
    AddData(PByte(sTxt), nStrLen);
    Result := TRUE;
    Exit;
  end;

  Result := FALSE;
end;

function TDIBuffer.CreatePackage(pData: PByte; nSize: Word): Boolean;
begin
  AddData(pData, nSize);
end;

procedure TDIBuffer.CreateTestPackage;
var
  i: Integer;
begin
  for i:=0 to MAX_PACKAGESIZE-1 do
    Buffer[i] := i mod 256;
  m_nUsed := MAX_PACKAGESIZE-1;
end;

end.

⌨️ 快捷键说明

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