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

📄 udidatapacket.pas

📁 楠楠写的DBiocp例子都是源码
💻 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 + -