首要就是创建完成端口,m_hCompletionPort
//创建完成端口
m_hCompletionPort = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
第一步 等待连接到来
第二步服务器接收连接之后,将接收连接的socket和完成端口绑定(m_hSocket为完成端口)
后面有一个取消息的过程
BOOL bResult = ::GetQueuedCompletionStatus(m_hCompletionPort, &dwNumberOfBytes, (PULONG_PTR)&lpTcpContext, &lpOverlapped, INFINITE);
lpTcpContext这个上下文,取得的就是这步此时绑定的这个lpTcpContext,
第三步 向完成端口投递接收请求
BOOL bResult = ::GetQueuedCompletionStatus(m_hCompletionPort, &dwNumberOfBytes, (PULONG_PTR)&lpTcpContext, &lpOverlapped, INFINITE);
lpOverlapped 这个上下文,就是此时传进去那个。
lpNewOverlapPlus这个参数是非常怪的参数,投递的时候只投递了overLapped部分(OVERLAPPEDPLUS的第一个结构),但是实际传进去了IoRead,m_oWasBuf等参数,
在取的时候:
BOOL bResult = ::GetQueuedCompletionStatus(m_hCompletionPort,
&dwNumberOfBytes, (PULONG_PTR)&lpTcpContext, &lpOverlapped, INFINITE),
先把 lpOverlapped先取出来,之后来个转换
lpOverlapPlus = (OVERLAPPEDPLUS *)lpOverlapped;
取整个OVERLAPPEDPLUS ,里面的IoRead信息都取出来了。之后想打印打印,想存内存存内存了。
后面的过程跟上一篇一样,你处理完了再次投递,供后面的消息用.
不足之处欢迎提意见改进 泰山鲁 20160913