DX10下面WSASocket阻塞的情况

今天帮群友调程序,说是程序会卡在WSASocket这一句。看CallStack

 

大概的流程是这样的

Application.Run –> LoadLibrary(A.dll, 带包bpl)->diocp.socket.utils( 初始化单元) –> loadIocpExFunction->WSASocket(阻塞了)

 

后来在主程序中引用diocp.socket.utils单元,使得初始化WSASocket提前到EXE中完成,一切正常

【DIOCP应用案例】-案例2(无毒公主)

案例2<无毒公主>

服务端应用场景:

金融行业交易行情、交易控制指令发布推送服务器。主要是要稳定和快速,对负载要求不高。日常在线20个左右。服务器和客户端都用的diocp实现的iocp异步模式。由于是金融类的应用,对稳定性和推送实时性有非常高的要求(关键时候如果指令延时长了,就会损失真金白银),而一路跟着diocp1走到现在diocp3稳定一年多了 ,各方面的表现完全满足需求。

公司名称:

某金融投资公司

DIOCP版本:

从diocp1到DIOCP3 <自定义的编码器>

QQ昵称:

五毒公主(782834)

建议与问题:

我现在这个还只是一个非常小规模的应用,但是有不同的客户端(指令控制端、管理员端、交易终端)会登录到系统,在不同的客户端多了以后 协议就会多很多。 现在是在在一个编码解码器上按命令字来区分再进行业务层的解析。 虽然能满足需求。但是总觉得 如果要做非常庞大和复杂的系统的话 ,协议的管理将非常麻烦。 所以觉得如果可以一个服务器开放多个端口,每个端口有自己的在线列表,不同的客户端登录到不同的端口、应用不同的编码解码器,同时又能统一管理(应为不同的客户端之前需要数据交、转发)这样就是极好的。

 

==========================================

DIOCP官方社区|MyBean官方社区

http://diocp.wedelphi.com/

==========================================

【DIOCP应用案例】-案例1(Tiger)

2014101153544361

DIOCP是Delphi下进行IOCP服务端通讯开发的一个非常好的开源框架,稳定、高效并且使用起来十分简单。 自己两个多月之前因为需要使用Delphi开发一个TCP服务端,当时也是到处爬文,希望找到一个稳定且好用的IOCP开源框架,整整一周的时间,看了很多,也对比了很多,最后选择了DIOCP,现在服务器端正式版本已经上线运行了36天的时间了,所有运行一切稳定,无论是CPU占用、内存使用还是通信稳定性,DIOCP的表现真的没有让我失望,表现得非常优秀。

服务器环境:
OS:Windows Server 2003
CPU:Intel 双核      内存:2G
网络带宽:5M
网络类型:BGP
实际性能数据:
程序用户同时在线数:1200 – 1300之间   峰值:1511(此峰值为真实用户同时在线数,不是理论性能峰值,目前的用户数只有这些,自己测试的时候,连接数测试过5K,也同样运行稳定)。
服务器端运行到发文时已经36天多了,内存峰值也只有76M,CPU占用一直都稳定在10%以下,应该说各项指标都非常的好,非常满意。

QQ:
Tiger

 

 

==========================================

DIOCP官方社区|MyBean官方社区

http://diocp.wedelphi.com/

==========================================

【DIOCP3-说明书】iocpTask中添加信号触发任务功能

【应用场景】

信号触发任务是为了可以重复触发信号对应的任务,而且可以把回调函数的绑定和触发信号分离,比如你可以在主窗体中注册信号对应的事件,然后在任何的线程和单元中安全的触发信号。

 

【使用DEMO】

主窗体中注册信号绑定回调函数

//注册信号,并绑定信号对应的回调函数
iocpTaskManager.registerSignal(1, OnSignalWork);


// 回调事件函数
procedure TfrmMain.OnSignalWork(pvTaskRequest:TIocpTaskRequest);
var
  lvData:TSimpleDataObject;
begin
  lvData:= TSimpleDataObject(pvTaskRequest.TaskData);
  if GetCurrentThreadId = MainThreadID then
  begin
    Memo1.Lines.Add('exeucte signal task in main thead:' + lvData.DataString1);
  end else
  begin
    logMessage('exeucte signal task in thread:' + lvData.DataString1);
  end;
end;

 

 

 // 可以在任何的地方安全的触发信号
 iocpTaskManager.SignalATask(1, TSimpleDataObject.Create('signal param'), ftFreeAsObject);

 

【相关函数】

注册函数:

procedure registerSignal(pvSignalID: Integer; pvTaskWork: TOnTaskWork);

pvSignalID      注册的信号ID, 重复注册时会引发异常。

pvTaskWork   信号对应的回调函数

 

触发函数:

procedure SignalATask(pvSignalID: Integer; pvTaskData: Pointer = nil;
        pvDataFreeType: TDataFreeType = ftNone; pvRunInMainThread: Boolean = False;
        pvRunType: TRunInMainThreadType = rtSync);

 

pvSignalID             信号ID

pvTaskData          触发信号带入的一些参数数据,在回调函数中可以获取(pvTaskRequest.TaskData)

pvDataFreeType   参数数据在任务执行完成或者投递失败后释放的方式(; , 

                             ftNone, 不做任何处理

                             ftFreeAsObject 调用TObject(TaskData).Free

                             ftUseDispose,    调用Dispose(TaskData)

pvRunInMainThread 是否在主线程中执行回调函数

pvRunType         主线程同步的方式,不带包的DLL中不能用rtSync模式