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