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 )

解决方案 »

  1.   

    是的,目前没有发现数据丢失的现象。可我不知道当dwIoError是997的时候是否己收到完整的数据还有当客户端掉线时dwIoError也是997,不知道有什么好办法可以处理。
      

  2.   

    997 == ERROR_IO_PENDING,重叠I/O正在进行。
    不用管它!
      

  3.   

    呵呵,同上,997是IO_PENDING,没有问题的,你应该这样:在WSARecv的时候判断GetlastError,如果不是997,就出错了。
    还有,客户端掉线的时候应该是IOSize为0,
    判断是否全部发送完数据的时候应该针对每个socket保存一个iSend,每次都将IoSize加到iSend上。因为完成端口的方式是异步方式,所以有可能发送了1个字节就通知你一下,也有可能全部发送完了才通知你。