diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)

之前群里说一台服务器最多是High(Word)的连接数65535,当时我看了下socket的类型是u_long,并不是word,虽然不用那么多连接数,虽然当时润哥做过测试。今天发现我的机子可以上6W的连接数,果断对diocp3做了下连接数测试。8W连接数,内存441M,应该上10W 不是啥问题。当然实际中不可能单台服务器可以处理这么多连接,显然是个装13的测试。只是求证下65535的测试

image

服务器的连接上限是到底是多少, 显然还是木有结论。我只是证实了>65535,我想理论值应该是high(u_long)。

DIOCP3-DIOCP1升级到DIOCP3

DIOCP3兼容DIOCP1的,有些属性做了修改

DIOCP3, uIOCPConsole没有了, uMemPool没有了

 

1.DIOCP1,代码:

9(BIPCH3%YHO3{3A~{{YEWI

DIOCP3中去掉TIOCPContextFactory, 可以直接往TIocpConsole(uIocpCentre单元中)对象上注册。TiocpConsole有对应的方法

这样可以每个TIocpConsole有自己独立的编码和解码器,更灵活,更方便了。

 

2.在线列表

DIOCP1中TIOCPContextFactory.instance.IOCPContextPool.getUsingList(lvList);

DIOCP3中TIocpTcpServer.getOnlineContextList(pvList:TList);

 

3.socket心跳

DIOCP1 设置 FIOCPConsole.setSystemSocketHeartState(false);

DIOCP3 设置 FIOCPConsole.KeepAlive := false;

 

4.断开客户端

clientcontext.disconnect

 

5. 解码器基类解码函数添加了pvContext: TObject参数

<加上该参数可以在解码时保存一些状态信息到连接上下文对象>
DIOCP1申明:
function Decode(const inBuf: TBufferLink): TObject;
DIOCP3申明:
function Decode(const inBuf: TBufferLink; pvContext: TObject): TObject;
virtual; abstract;

 

你不需要调用解码器函数, uIocpCentre.pas中是内部调用的解码器函数,  只要把之前解码器的函数申明加上参数就好

【DIOCP3-商业应用】服务端的分布式逻辑处理方案

【项目概述】

      本项目致力于服务端的应用,致力于服务端的稳定,让开发人员专注与逻辑的编写。

 

【项目保障】

      通讯服务器保证7*24小时在线,逻辑进程可以分布式部署,这样即使一个逻辑进程崩溃,另外的逻辑进程可以自动接管工作。

 

【项目性能】

      网络通信基于diocp3,高并发,同时在线可以保证在1W左右,逻辑处理可以分布式到多台计算机。

[DIOCP3-IocpTask说明书]基于IOCP引擎的多线程任务的投递和回调处理单元

【说明】

IocpTask是基于Iocp引擎的多线程任务投递和处理单元,可以方便的把任务进行投递到IOCP线程进行统一调度和处理,是模仿QDAC-QWorker的处理方式,支持D7以上的版本。

【使用方法】

使用上很简单,下面解释一种比较全面的方法:

procedure PostATask(pvTaskWork:TOnTaskWork;
       pvTaskData:Pointer = nil;
       pvRunInMainThread:Boolean = False;
       pvRunType:TRunInMainThreadType = rtSync);overload;

参数:

   pvTaskWork

       回调函数,procedure(pvTaskRequest: TIocpTaskRequest) of object;  pvTaskRequest可以访问到传入的taskData,strData等信息。

  pvTaskData

      是传入的数据,为指针类型,可以是任何的数据,在回调函数中可以通过pvTaskRequest对象进行获取得到。

pvRunInMainThread:

      回调函数是否在主线程中运行,考虑到一些需要访问主线程界面的任务,需要在主线程中运行。

pvRunType:

     同步的方式,支持两种,一种是rtSync是使用线程的同步模式,rtPostMessage,使用消息 + Event等待的模式。消息模式考虑到dll中同步方法无法使用时可以采取的同步方式。

【注意事项】

     主窗体销毁时,很多资源都已经被销毁,如果此时有投递需要主线程处理的任务,可能会导致主线程挂起,而整个进程无法结束的情况。

复制代码

destructor TfrmMain.Destroy;
begin
  FLogTask.PostATask(onLogMsg, 'abcd', True, rtPostMessage);
  Sleep(100);
  FLogTask.Active := false;
  FLogTask.Free;
  inherited Destroy;
end;

复制代码

上面的代码会导致程序无法退出,FLogTask.PostATask(onLogMsg, ‘abcd’, True, rtPostMessage); 是投递到主线程执行的任务,这个时候主窗体正在销毁,无法相应PostMessage的消息(Synchronize方式也是一样会堵塞)导致FMessageEvent会一直等待下去,所以需要注意的是在主窗体销毁的时候不要进行主线程任务的投递。可以在主窗体的destroy中,可以禁止相应投递任务, 在主窗体析构函数的开始,设置Enable := false; 这样iocpTask不会再处理任何的任务,注意是析构函数的第一句,不是窗体的FormDestory事件。

复制代码

destructor TfrmMain.Destroy;
begin
  FLogTask.Enable := false;
  iocpTaskManager.Enable := False;

  .....

  inherited Destroy;
end;

复制代码

[DIOCP3-说明书] 关于DEMO的编译

总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤。

【环境设定】

1.将DIOCP3\source路径添加到Delphi的搜索路径,[tool->options->Environment Options->Delphi Options –> Libaray –>Libaray Path]

2.打开samples\下面的工程可以进行编译

【常见问题】

1.XE2以上版本,有时候提示一些vcl的单元找不到。

image

解决方法:

工程添加vcl域

image

2. XE2以下版本提示找不到System.actions;

image

解决方法

直接删除即可(一些DEMO在XE5和XE6上面完成的,这个是自动添加的,低版本没有,可以直接删除)

3. D7 下面提示, Application.MainFormOnTaskbar := True;编译不过去

image

解决方法:

直接删除即可,D7不认识这段代码,这是2007以上版本自动生成的。