在很多的 IOCP 例子程序中,都没有提到如何来做超时控制。
虽然 IOCP 可以支持很多的连接,但是在实际的环境中,如果不对 IO 操作做超时控制,也是有很大风险的。
在参考了 libevent 的做法之后,模仿 libevent 1.4 的做法,用一个 min-heap 来记录 IOCP 的 IO 操作。
当发起一个 IO 操作的时候,用 ( 当前时间 + 设定的超时时间 ) 作为这个操作的超时时间,
用这个超时时间作为 key ,在 min-heap 中插入一个记录。
按 min-heap 的定义,其中的第一个元素是最快超时的操作。
在 GQCS 的时候,通过拿当前时间和 min-heap 的第一个元素做比较,把两者的差值作为 GQCS 的超时时间。
当 GQCS 返回的时候,如果发现是超时事件,那么就从 min-heap 中把小于当前时间的所有操作都 pop 出来,这些操作都是已经超时的。
具体的实现代码,大概如下。
插入到 min-heap 的记录,通常就使用 PER_IO_DATA ,可能是这样的
struct PER_IO_DATA
{
OVERLAPPED overlapped;
...
...
int heapIndex;
struct timeval timeout;
};
就是在常见的 PER_IO_DATA 上加上 heapIndex 和 timeout 两个成员,提供给 min-heap 使用。
详细的实现代码,暂时可以通过 svn 得到。等代码经过更多的测试之后,将会发布一个新版本的 SPServer。
svn checkout
http://spserver.googlecode.com/svn/trunk/ spserver-read-only
--------------
stephen.nil
2008-05-17