📄 udidatapacket.pas
字号:
unit uDIDataPacket;
interface
uses
Windows, WinSock2, SysUtils, StrUtils, uDIProtocol;
type
PTDIDataPakHead = ^TDIDataPakHead;
TDIDataPakHead = record
_Head: Byte; //帧头标志 64
_Len: Word; //数据包长度
end;
PTTDIDataPakBody = ^TTDIDataPakBody;
TTDIDataPakBody = record
_Sing: Word; //客户标识
_SocketKey: Word; //Socket标识
_OP: Byte; //控制码 1 回射
end;
//.数据.
PTDIDataPakEnd = ^TDIDataPakEnd;
TDIDataPakEnd = record
_CheckSum: Byte; //校验和
_End: Byte; //帧结束符
end;
//TDIDataPacket
TDIDataPacket = Class
private
m_pBuffer: PByte; //数据指针
m_nUsed: Integer; //包使用大小
m_nBufSize : Integer; //数据包大小
FDataPakHead: TDIDataPakHead; //包头
FDataPakBody: TTDIDataPakBody;//包体
FDataPakEnd: TDIDataPakEnd; //包尾
function CheckSum: Byte;
procedure InitDataPacket;
procedure CreatePackage;
procedure FreePackage;
public
function GetBuffer: PByte; //得到Buffer
function GetUsed: Integer; //得到Buffer长度
public
constructor Create;
destructor Destroy; override;
end;
const
FDataPakHeadLen = SizeOf(TDIDataPakHead);
FDataPakBodyLen = SizeOf(TTDIDataPakBody);
FDataPakEndLen = SizeOf(TDIDataPakEnd);
implementation
uses Dialogs;
constructor TDIDataPacket.Create;
begin
inherited Create;
CreatePackage;
end;
destructor TDIDataPacket.Destroy;
begin
FreePackage;
inherited Destroy;
end;
procedure TDIDataPacket.InitDataPacket;
begin
ZeroMemory(@FDataPakHead, SizeOf(FDataPakHead));
ZeroMemory(@FDataPakBody, SizeOf(FDataPakBody));
ZeroMemory(@FDataPakEnd, SizeOf(FDataPakEnd));
end;
function TDIDataPacket.CheckSum: Byte;
var
i: Integer;
p: PByte;
bValue, bCheckSum: Byte;
begin
bCheckSum := 0;
p := m_pBuffer;
for i:=1 to m_nUsed do begin
bValue := p^;
bCheckSum := bCheckSum +bValue;
Inc(p, 1);
end;
Result := bCheckSum;
end;
function TDIDataPacket.GetBuffer: PByte;
begin
Result := m_pBuffer;
end;
procedure TDIDataPacket.CreatePackage;
var
sMsg: String;
nStrLen: Integer;
begin
sMsg := 'hello, DBIOCP.';
nStrLen := length(sMsg);
if (nStrLen>0) then begin
m_nBufSize := nStrLen + FDataPakHeadLen + FDataPakBodyLen +FDataPakEndLen;
GetMem(m_pBuffer, m_nBufSize);
ZeroMemory(m_pBuffer, m_nBufSize);
FDataPakHead._Head := 64; //包头帧 64
FDataPakHead._Len := m_nBufSize - SizeOf(Byte); //包长度
FDataPakBody._Sing := 16; //标置位
FDataPakBody._SocketKey := 8988; //Socket标志
FDataPakBody._OP := 1; //回射
//包头
CopyMemory( Pointer(LongInt(m_pBuffer)),
@FDataPakHead,
FDataPakHeadLen );
m_nUsed := FDataPakHeadLen;
//包体, 从包头开始
CopyMemory( Pointer(LongInt(m_pBuffer)+ FDataPakHeadLen),
@FDataPakBody,
FDataPakBodyLen );
m_nUsed := m_nUsed + FDataPakBodyLen;
//拷贝数据
CopyMemory( Pointer(LongInt(m_pBuffer)+ FDataPakHeadLen+FDataPakBodyLen),
PByte(sMsg),
nStrLen );
m_nUsed := m_nUsed + nStrLen;
//计算检验和
FDataPakEnd._CheckSum := CheckSum;
FDataPakEnd._End := 16; //包尾帧 16
m_nUsed := m_nUsed + FDataPakEndLen;
end;
end;
function TDIDataPacket.GetUsed: Integer;
begin
Result := m_nUsed;
end;
procedure TDIDataPacket.FreePackage;
begin
FreeMem(m_pBuffer, m_nBufSize);
inherited Destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -