Windows下高并发的高性能服务器一般会采用完成端口IOCP技术,Linux下则会采用Epoll。
最近写enp时发现Iocp和Epoll的一个根本区别是Epoll是返回多个socket中有事件发生的socket,类似select,不过性能更高;Iocp则是在动作完成后返回通知(完成端口中的“完成”就是这个意思)。
两者都能够把socket和一个4字节Key字段绑定在一起,Epoll中是epollevent的data字段,Iocp是Key字段。他们都能在捕获到事件时返回给应用层。看到许多实例是把socket值当作Key字段,估计是实例的缘故,实际产品中,会是一个能找到socket对应session的字段,例如session的下标或session的地址,enp中session是预分配的,key字段就是session的下标。
在Iocp中,连接被客户端关闭、recv完成、send完成、连接完成、accept完成、连接被服务器关闭、超时都会在Get函数中捕获到事件。如何区分具体是哪个事件,是通过返回的Overlapped和Bytes字段配合判断的。在enp中,没有为每个session都分配Overlapped结构,而是所有session共用几个Overlapped。