盒子资源分类
iocp包处理可伸展弹性缓冲区类
关键字:iocp iocp包处理可伸展弹性缓冲区类
来 自:原创
平 台:Win2k/XP/NT,Win2003
下载所需:0 火柴
深浅度:中级
完成时间:2009/1/21
发布者:snoopy_teng
发布时间:2009/2/20
编辑器:DELPHI7
语 种:简体中文
分 类:网络
下载浏览:1416/7616
{---------- 单元名称: 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; ----------}
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们 !
相关文章
相关评论
共有评论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的粘包,本标哥了解个概念。什么时候发生就不知道了。。 不过很多高手的话,总是让人一头雾水。想学点东西不容易啊,希望高手能诚心指点 不要这样不屑,关键地方又不说,不过有所保留是可以理解的,但不要酷的过头。 乱弹一下啊,哈。
我要发表评论
查看全部评论