捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
iocp包处理可伸展弹性缓冲区类
关键字:iocp iocp包处理可伸展弹性缓冲区类
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2009/1/21
发布者:snoopy_teng 发布时间:2009/2/20
编辑器:DELPHI7 语  种:简体中文
分 类:网络 下载浏览:1416/7616
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
{----------
 单元名称: uStretchBuffer
 说    明: 可伸展弹性缓冲区
 作    者: 滕启荣 (原创) QQ 317877706
 日    期: 20-一月-2009
 使用方法:
 var
  sMsg: string;
  pOutData: array of char;
  iLen: Integer;
  StretchBuffer: TStretchBuffer;
begin
  StretchBuffer := TStretchBuffer.Create;
  sMsg := '12';
  StretchBuffer.WriteBuffer(pchar(sMsg), Length(sMsg));

  StretchBuffer.RemoveBuffer(5, 2);

  SetLength(pOutData, StretchBuffer.BufferSize);
  iLen := StretchBuffer.ReadBuffer(@pOutData[0], 0, StretchBuffer.BufferSize);
  sMsg := pchar(@pOutData[0]);

  StretchBuffer.Free;
end;

----------}
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论8条 当前显示最后6条评论
snoopy_teng 2009/2/20 18:01:04
{----------
 单元名称: uStretchBuffer
 说    明: 可伸展弹性缓冲区
 作    者: 滕启荣 (原创)
 日    期: 20-一月-2009
 使用方法:
 var
  sMsg: string;
  pOutData: array of char;
  iLen: Integer;
  StretchBuffer: TStretchBuffer;
begin
  StretchBuffer := TStretchBuffer.Create;
  sMsg := '12';
  StretchBuffer.WriteBuffer(pchar(sMsg), Length(sMsg));

  StretchBuffer.RemoveBuffer(5, 2);

  SetLength(pOutData, StretchBuffer.BufferSize);
  iLen := StretchBuffer.ReadBuffer(@pOutData[0], 0, StretchBuffer.BufferSize);
  sMsg := pchar(@pOutData[0]);

  StretchBuffer.Free;
end;

----------}
unit uStretchBuffer;

interface

uses
  Windows, SysUtils;

type
  TStretchBuffer = class
  private
    FBuffer: PByte;
    FBufSize: Integer;
    function GetBufferSize: Integer;
    procedure AppendBufferSize(AppendSize: Integer);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure WriteBuffer(pBuffer: PChar; BufLen: Integer);
    function ReadBuffer(pOutBuffer: PChar; StartPos: integer; BufLen: Integer): Integer;
    function RemoveBuffer(StartPos: integer; RemoveSize: Integer): Integer;
  published
    property BufferSize: Integer read GetBufferSize;
  end;

implementation

constructor TStretchBuffer.Create;
begin
  inherited Create;
  FBufSize := 0;
  FBuffer := nil;
end;

destructor TStretchBuffer.Destroy;
begin
  Clear;
  inherited Destroy;
end;

procedure TStretchBuffer.Clear;
begin
  if FBufSize > 0 then
    FreeMem(FBuffer, FBufSize);
  FBufSize := 0;
  FBuffer := nil;
end;


function TStretchBuffer.GetBufferSize: Integer;
begin
  Result := FBufSize;
end;

{----------
  过程函数: AppendBufferSize
  说    明: 申请内存
  作    者: 滕启荣
  日    期: 20-一月-2009
  参    数:
  返 回 值:
----------}

procedure TStretchBuffer.AppendBufferSize(AppendSize: Integer);
var
  FNewBuffer: PByte;
  FOldBufSize: Integer;
begin
  if AppendSize = 0 then exit;
  FOldBufSize := FBufSize;
  FBufSize := FBufSize + AppendSize;
  GetMem(FNewBuffer, FBufSize);
  ZeroMemory(FNewBuffer, FBufSize);
  CopyMemory(Pointer(LongInt(FNewBuffer)), Pointer(LongInt(FBuffer)), FOldBufSize);
  FreeMem(FBuffer, FOldBufSize);
  FBuffer := FNewBuffer;
end;

{----------
  过程函数: WriteBuffer
  说    明: 写入缓冲区
  作    者: 滕启荣
  日    期: 20-一月-2009
  参    数:
  返 回 值: 写入长度
----------}

procedure TStretchBuffer.WriteBuffer(pBuffer: PChar; BufLen: Integer);
begin
  if BufLen = 0 then exit;
  AppendBufferSize(BufLen);
  CopyMemory(Pointer(LongInt(FBuffer) + FBufSize - BufLen), Pointer(LongInt(pBuffer)), BufLen);
end;

{----------
  过程函数: ReadBuffer
  说    明: 读取缓冲区
  作    者: 滕启荣
  日    期: 20-一月-2009
  参    数:
  返 回 值: 读取长度
----------}

function TStretchBuffer.ReadBuffer(pOutBuffer: PChar; StartPos: integer; BufLen: Integer): Integer;
begin
  Result := -1;
  if BufLen = 0 then exit;
  if (FBufSize - StartPos) < BufLen then BufLen := FBufSize - StartPos;
  CopyMemory(Pointer(LongInt(pOutBuffer)), Pointer(LongInt(FBuffer) + StartPos), BufLen);
  Result := BufLen;
end;

{----------
  过程函数: RemoveBuffer
  说    明: 擦除缓冲区
  作    者: 滕启荣
  日    期: 20-一月-2009
  参    数:
  返 回 值: 擦除长度
----------}

function TStretchBuffer.RemoveBuffer(StartPos, RemoveSize: Integer): Integer;
var
  FNewBuffer: PByte;
  FOldBufSize: Integer;
begin
  Result := -1;
  if StartPos < 1 then StartPos := 1;
  if RemoveSize = 0 then exit;
  FOldBufSize := FBufSize;
  FBufSize := FBufSize - RemoveSize;
  GetMem(FNewBuffer, FBufSize);
  ZeroMemory(FNewBuffer, FBufSize);
  CopyMemory(Pointer(LongInt(FNewBuffer)), Pointer(LongInt(FBuffer)), StartPos - 1);
  CopyMemory(Pointer(LongInt(FNewBuffer) + StartPos - 1), Pointer(LongInt(FBuffer) + StartPos + RemoveSize - 1), FOldBufSize - StartPos - RemoveSize + 1);
  FreeMem(FBuffer, FOldBufSize);
  FBuffer := FNewBuffer;
  Result := RemoveSize;
end;

end.
riverqh 2009/3/17 11:04:16
考虑一下,增加一个机制申请内存时要多一点,譬如每次都是 32 byte的整数倍,这样不至于每次WriteBuffer都要重新调整,极端的情况下每次 WriteBuffer 一个字节……
138soft 2009/3/18 17:28:04
根本就跟IOCP粘不上边...
IOCP的实质是什么?
如果需要这种LOCK,不如不用.
skywings 2009/3/24 15:06:32

 填充重叠结构的BUFFER 除了用copymemory方法,delphi还有其他更好的方法么 ?
aizjcn 2009/3/29 17:21:49
用缓冲解决IOCP粘包处理;可以用缓冲区把IOCPCSer处理成兼容indy旧版程序的升级;目前在外的IOCP开源服务端代码基本是采用的接收发送双缓;看不出所谓的没关系;至于有问题,问题出在哪里;还是希望某金不咬只喷口水。。。拿出更好的解决方案;
skywings 2009/4/9 15:09:40

  顶,IOCP的粘包,本标哥了解个概念。什么时候发生就不知道了。。

不过很多高手的话,总是让人一头雾水。想学点东西不容易啊,希望高手能诚心指点

不要这样不屑,关键地方又不说,不过有所保留是可以理解的,但不要酷的过头。

乱弹一下啊,哈。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表