捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
ScktIocp(与ScktComp兼容的IOCP组件)
关键字:IOCP Socket
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:高级 完成时间:2009/5/16
发布者:cmd9x 发布时间:2009/5/17
编辑器:BDS2006 语  种:简体中文
分 类:网络 下载浏览:3205/12519
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
与ScktComp兼容的IOCP服务端组件
参考了IOCPComp组件和ScktComp组件,可以直接替换ScktComp的TServerSocket
其中的事件方法大致相同,同于本身的IOCP特性,不再提供原TServerSocket的线程阻塞选项.核心文件(ScktIocp.pas)
测试时先导入注册表文件,修改连接数,在XP下测试可连接3万个连接.
用FastMM4测试,没有发现内存泄漏,应用大规模服务还有待测试.
如发现有错误之处请更正后通知本人.
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论17条 当前显示最后6条评论
cmd9x 2009/7/13 12:23:59
关于内存流接收数据,设计初衷是这样的:
用内存流接收数据后会触发OnRead事件,实现这个事件时要调用
TServerClientWinSocket.ReceiveBuf
这时会将数据从内存流中读出来,为了不频繁分配内存,只对内存流的指针改了位置。
而真正应该改的地方是
function TServerClientWinSocket.ReceiveLength: Integer;
begin
  Result := FStream.Position;
  {原来是Result := FStream.Size;(的确会因为上次数据较多而产生垃圾数据)}
end;
cmd9x 2009/7/13 12:36:48
1、支持D2009没什么难的,把所有的String改成AnsiString,PChar改成PAnsiPChar就差不多了。
2、这个组件是一个服务组件,设IP地址做什么呢?
3、至于只能连少量链接的情况倒是没有碰到,你可以自己写个可以产生多个客户端的程序来测,要想链接上万,必须导入注册文件以修改系统链接数限制
4、关于内存泄漏这个我没什么好说的,源码摆着呢,高手们帮忙检查一下吧
5、关于替换ScktComp,我的建议是在单元引入时加编译选项{$IFDEF IOCP}uScktIocp{$ELSE}uScktComp{$ENDIF};这样就可以直接替换了
glwang 2009/7/13 15:04:09
谢谢控主的解答,希望能持续完善升级!
cmd9x 2009/7/19 11:25:48
新修改:
TCustomWinSocket类添加了
function ReceiveText: string; virtual;
function TCustomWinSocket.ReceiveText: string;
begin
  if ReceiveLength > 0 then
  begin
    SetLength(Result, ReceiveLength);
    ReceiveBuf(Result[1], Length(Result));
  end else Result := '';
end;

function TServerClientWinSocket.ReceiveLength: Integer;
begin
  Result := FStream.Position;
end;
function TServerClientWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
var P1: Integer;
  PS, PD: Pointer;
begin
  Lock;
  try
    P1 := FStream.Position;
    FStream.Seek(0, soBeginning);
    FStream.ReadBuffer(Buf, Count);
    if FStream.Position = P1 then
    begin
    {大于4K就放掉重新分配内存,否则,只是将指针移动到头部}
      if FStream.Size > 4096 then
        FStream.Clear
      else
        FStream.Seek(0, soBeginning);
    end
    else if FStream.Position < P1 then
    begin
      PS := Pointer(Longint(FStream.Memory) + FStream.Position);
      Move(PS^, FStream.Memory^, P1 - FStream.Position);
      FStream.Position := P1 - FStream.Position;
    end;
  finally
    UnLock;
  end;
end;

QQ群:1285183
from 2009/9/1 17:05:43
我是这样改的

function ReceiveText: string; virtual;
function TCustomWinSocket.ReceiveText: string;
begin
  if ReceiveLength > 0 then
  begin
    SetLength(Result, ReceiveLength);
    ReceiveBuf(Result[1], Length(Result));
  end else Result := '';
end;

function TServerClientWinSocket.ReceiveLength: Integer;
begin
  Result := FStream.Position;
end;
function TServerClientWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
var
  P, Len: Integer;
begin
  Lock;
  try
    if FStream.Position >= Count then begin
      P := FStream.Position - Count;
      FStream.Position := P;
      Len := Count;
    end else begin
      P := 0;
      Len := FStream.Position;
      FStream.Position := P;
    end;

    Result := FStream.Read(Buf, Len);
    if FStream.Position = FStream.Size then begin
       //大于4K就放掉重新分配内存,否则,只是将指针移动到头部
      if FStream.Size > 4096 then
        FStream.Clear
      else
        FStream.Position := 0;
    end else begin
      FStream.Position := P + (Len - Result);
    end;
  finally
    UnLock;
  end;
end;
melice 2012/2/25 22:09:00
下载链接似乎down了,谁能共享一下么,谢谢。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表