写网络代码时,总希望把逻辑和网络层分开。而在IOCP这样的高并发连接时,Get中返回所带的Key性价比让人垂涎不止。可以把逻辑和网络当成一个对象通过KEY返回,也可以通过一个网络ID,来查找逻辑对象。来讨论下前者:
IOCP_KEY={NetObject, LogicObject}; //暂时结合在一起
当Accept时,申明出一个IOCP_KEY进行维护。Get获得IOCP_KEY时,下一步就是传给上层的逻辑处理。而做法上又不想把整个IOCP_KEY给上层,这样的话结构之间耦合太紧。对上层来说,必须的是一个收到的协议包内容,一个逻辑对象(看需求也可以加入一个网络对象进行直发).所以添加了一个bridge文件,专门取出有用的信息,独立在两者之间。具体的框架图如下:
明显的,逻辑对象被搁在了网络层的最低端,虽然可以通过Bridge进行拆分,但是整体的架构上隐患很多。
那么,如果把NetObject和LogicObject分开,逻辑对象.h自然的回到World的级别上来(图不给了,想象)。看了一些代码发现很多都是通过一个共同的ID来查找。即IOCP获得NetObject(IOCP_KEY)中的ID后,同时查找到LogicObject的ID,然后返回。采用HASH的方法效率虽然可以接受,但是还有更好的o(1)复杂度算法。(提示,链表+数组)