现在的位置: 首页 > 综合 > 正文

日志,IOCP中一些应该注意的小细节

2013年10月14日 ⁄ 综合 ⁄ 共 1078字 ⁄ 字号 评论关闭

1.OVERLAPPED结构需要在绑定时初始化一次,填充为0

2.在工作线程中调用printf会出现打印两次的情况,这个不算问题,主要是因为工程的C运行时库不是多线程版本,将工程设置为支持Multithreaded就行了。

3.套接字资源回收的问题。对方如果断开了连接,也关闭了套接字,本地也检测到对方关闭了连接,但这并不意味着套接字资源已经释放掉了,还必须调用closesocket才能释放连接所占有的套接字资源,也就是这个套接字ID可以被accept函数重新利用了(当然,AcceptEx那种套接字池一类的模式并不需要closesocket,而是一种更节约的重利用规则,好处自然是不必说了。)

4.重叠和异步。本人认为这两者的区别还是很明显的,异步范围太广大的,重叠必然异步,异步的未必都是重叠的,言至此,下面就不知道说些什么了。

5.SOCKET hSocket=::socket(...);//这种hSocket是支持重叠的,并非只有调用WSASocket并指定WSA_FLAG_OVERLAPPED标志之后所创建的hSocket才具有重叠属性。

6.关于心跳检测,本人认为,底层IOCP设计不应该考虑这个问题,考虑这个问题的应该是上层应用,是在网关服务器里面做检测还是在发言广播服务器里面检测完全可以视情况而定,如果非要在IOCP封装类里面提供心跳检测模块,那还得搞一个开关,需要开启的时候才开启检测,总不能一个网络游戏集群服务器组,地图服务器也心跳检测,登录服务器也检测……

7.关于内存池。内存池这东西还真是让人不知道说什么好,成熟的产品有不少,很多人也动手写过,效率怎么样,写过的人也都心知肚明,反正本人写的内存池是不太行。抛开效率不谈,存储资源节约问题才是选择内存池的关键,不过,还是希望用一些成熟的产品。linux下好用的内存池有不少,windows下嘛,高版本的VS可享有几个好产品,VC6.0这种古董级编译器,貌似就没有什么好的选择了。本人要求不高,windows内存池,支持多线程,但起码也得用head-tail锁的,简单的临界区……不行!

8.IOCP工作线程获取数据以后,到底该如何分发处理?数据处理线程是必须要有的,问题是是不是所有数据处理都得通过队列交给数据处理线程。本人想,不十分耗时的操作就在工作线程中解决,耗时的操作再投递到队列中,毕竟,队列操作一般是要加锁的。

9.是否需要FIFO队列?如果一个工作线程对应一个队列的话,那么FIFO队列是必然的选择,嗯,求稳定好用的FIFO队列,有的吼一声啊。

 

。。。其他问题,以后发现了再提出来

抱歉!评论已关闭.