DWORD dwIoSize;
ULONG ulFlags = 0;//MSG_PARTIAL;
UINT nRetVal;
nRetVal = WSARecv(this->m_hSocket,
&this->m_wsaInBuffer,
1,
&dwIoSize,
&ulFlags,
&this->m_Ov,
NULL);
... LPOVERLAPPED pOv;
while(bRunning)
{
try
{
bIORet = GetQueuedCompletionStatus(
hCompletionPort,
&dwIoSize,
(LPDWORD) &dwIOCompletionKey,
&pOv, INFINITE);
dwIoError = GetLastError();
pClient = CONTAINING_RECORD(pOv, CClient, m_Ov);
...为什么dwIoError 总是 997( WSA_IO_PENDING )
不用管它!
还有,客户端掉线的时候应该是IOSize为0,
判断是否全部发送完数据的时候应该针对每个socket保存一个iSend,每次都将IoSize加到iSend上。因为完成端口的方式是异步方式,所以有可能发送了1个字节就通知你一下,也有可能全部发送完了才通知你。