//
/// “完成端口”模型(IOCP)(基于重叠端口(异步)的LF线程池框架)
/// I/O完成端口是应用程序使用线程池来进行处理异步的I/O请求的一种机制。
/// 使用I/O完成端口比在I/O请求时创建线程更快更有效
/// 应用程序发出一些异步的I/O请求,当这些请求完成时,设备驱动将这些工作项目排序到完成端口
/// 这样在完成端口上等待的线程池,便可以处理这些完成的I/O
/// 首先,说说主线程:
/// 1.创建完成端口对象
/// 2.创建工作者线程(这里工作者线程的数量是按照CPU的个数来决定的,这样可以达到最佳性能)
/// 3.创建监听套接字,绑定,监听,然后程序进入循环
/// 4.在循环中,我做了以下几件事情:
/// (1).接受一个客户端连接
/// (2).将该客户端套接字与完成端口绑定到一起(还是调用CreateIoCompletionPort,但这次的
/// 作用不同),注意,按道理来讲,此时传递给CreateIoCompletionPort的第三个参数应该是
/// 一个完成键,一般来讲,程序都是传递一个单句柄数据结构的地址,该单句柄数据包含了和
/// 该客户端连接有关的信息,由于我们只关心套接字句柄,所以直接将套接字句柄作为完成键传递;
/// (3).触发一个WSARecv异步调用,这次又用到了“尾随数据”,使接收数据所用的缓冲区紧跟
/// 在WSAOVERLAPPED对象之后,此外,还有操作类型等重要信息。
/// 在工作者线程的循环中,我们
/// 1.调用GetQueuedCompletionStatus取得本次I/O的相关信息(例如套接字句柄、传送的字节数、单I/O数据结构的地址等等)
/// 2.通过单I/O数据结构找到接收数据缓冲区,然后将数据原封不动的发送到客户端
/// 3.再次触发一个WSARecv异步操作
//