在上篇介绍了重叠 IO 的基本知识并使用事件的方式实现了第一个版本,但大家知道使用事件的缺点,因为 WaitForSingleObject 函数最多只能等待 64 个事件,所以要想处理更多的客户端得通过多个工作者线程来同时监视 Event 对象,这样便使处理更加麻烦,而且和事件选择其实一样依旧存在着部分阻塞。 所以今天来看第二种实现重叠 IO 的方法,即使用 Completion Routine。接着上篇,我们说这种方法是跟 WSASend 和 WSARecv 函数的最后一个参数有关的,所以再来看看其原型: int WSARecv ( SOCKET s, // 套接字句柄 LPWSABUF lpBuffers, // 指向待接收数据缓冲区 DWORD dwBufferCount, // lpBuffers数组的长度 LPDWORD lpNumberOfBytesRecvd, // 保存实际接收的字节数 LPDWORD lpFlags, // 数据传输标志 LPWSAOVERLAPPED lpOverlapped, // 指向重叠结构 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE // 指向Completion Routine函数… Continue Reading 网络模型之重叠IO(二)