SOCKET缓存

SOCKET缓存

/// <author>cxg 2020-7-13</author>
/// socket缓存(线程安全)

unit sockBuf;

interface

uses
  System.SyncObjs, Net.SocketAPI, Net.CrossSocket.Base, Net.CrossSocket,
  System.Generics.Collections, System.Classes, System.SysUtils;

const
  bufsize = 32768; //32K

type
  TSockBuf = class
  private
    bufs: TDictionary<ICrossConnection, TMemoryStream>; 
    fCS: TCriticalSection;
  public
    constructor Create;
    destructor Destroy; override;
    function process(const Connection: ICrossConnection; const Buf: Pointer; const Len: Integer): TMemoryStream;
    procedure remove(const Connection: ICrossConnection);
  end;

implementation

{ TSockBuf }

constructor TSockBuf.Create;
begin
  bufs := TDictionary<ICrossConnection, TMemoryStream>.Create;
  fCS := TCriticalSection.Create;
end;

destructor TSockBuf.Destroy;
begin
  for var v: TMemoryStream in bufs.Values do
    v.Free;
  FreeAndNil(bufs);
  FreeAndNil(fCS);
  inherited;
end;

function TSockBuf.process(const Connection: ICrossConnection; const Buf: Pointer; const Len: Integer): TMemoryStream;
begin
  fCS.Enter;
  if not bufs.ContainsKey(Connection) then  
  begin
    Result := TMemoryStream.Create;
    bufs.Add(Connection, Result);
  end
  else     
    bufs.TryGetValue(Connection, Result);
  fCS.Leave;
  Result.Write(Buf^, Len);
end;

procedure TSockBuf.remove(const Connection: ICrossConnection);
begin
  fCS.Enter;
  bufs[Connection].Free;
  bufs.Remove(Connection);
  fCS.Leave;
end;

end.

  

posted @ 2020-07-13 22:37  delphi中间件  阅读(652)  评论(0编辑  收藏  举报