完成端口中存在大BUG
今天用完成端口做测试时,发现连接A有可能收到连接B的数据。出错情况如下:
B连接的SOCKET号为992,B连接在做大量收发数据后closesocket。
若A连接建立时的SOCKET号也为992,这时A有可能会收到本该发给B的数据。
发生这种错误的概率比较小,我估计关闭B套接口时,内核中没能把已经投递到完成队列中的与992套接口相关的东东给清除掉,此时新的992套接口又被建立,那么新的套接口将有可能收到老的事件通知。
说句实话,本人觉得微软的IOCP设计的实在是有点垃圾,关闭套接口后不把东西清理干净。设计者初衷是想充分利用多线程的优势,但多线程造成的后果是很多事件的顺序根本得不到保证。而且还要加大量的锁,不仅增加了程序复杂度,而且锁加多了,多线程的优势也就没有了。
我用epoll写的网络组件,效率之高,CPU占用率之低,程序之简洁,隐藏BUG之少,都是IOCP无法比拟的。