📄 udibuffer.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 + -