|
对于 IClient 系列组件,一个组件对象对应一个 Connection ID 和一个通信连接,因此很
容易把通信连接与应用层数据关联起来。应用程序与组件交互时,直接通知组件处理数据即
可(如:Send( pData, iLength))。如图 2.1.5-1 所示:
注意:对于 IClient 组件,可以通过 SetExtra() / GetExtra() 方法绑定、获取附加数据。
对于 IServer 和 IAgent 系列组件,一个组件对象管理多个通信连接,HP-Socket 把通信
连接抽象为 Connection ID,应用程序与组件交互时,需要指定 Connection ID 来告知组件处
理哪个连接(如:Send(dwConnID, pData, iLength) )。如图 2.1.5-2 示:
应用程序为了建立 Connection ID 与应用层数据的对应关系通常需要维护一张映射表
(如:map<CONNID, TMyAppData*>),从而不但增加了应用程序的负担;另外,由于运行
在多线程环境下,对映射表的读写操作需要进行同步处理,从而降低了应用程序的并发性能。
HP-Socket 为 IServer 和 IAgent 系列组件提供以下方法组绑定 Connection ID 和应用层数
据,尽量避免让应用程序维护映射表。
⚫ BOOL SetConnectionExtra(CONNID dwConnID, PVOID pExtra)
⚫ BOOL GetConnectionExtra(CONNID dwConnID, PVOID* ppExtra)
通常的应用情景如下:
1) 在 OnAccept() / OnConnect() 事件中调用 SetConnectionExtra(dwConnID, pExtra)
把 Connection ID 和应用层数据进行绑定。
2) 在 OnReceive() / OnSend() 事件中调用 GetConnectionExtra(dwConnID, ppExtra)
取出与 Connection ID 绑定的应用层数据,执行相应业务逻辑处理。
3) 在 OnClose() 事件中取消 Connection ID 和应用层数据的绑定,清除应用层数据
并释放资源。
注意:由于 HP-Socket 已经确保了 OnReceive() / OnClose() 等事件的线程安全,因此应
用程序可以放心使用连接绑定机制,不用担心同步问题。
|
|