void CConnection::HandleIoComplete( AsynIoResult * result ) { AsynIoDevice * device = result->GetAsynDevice(); assert(device); assert(m_pHandler); DWORD dwError = result->GetErrorCode(); if ( result->Success() ) { switch(result->GetType()) { case ASYN_IO_ACCEPT: // Incoming Connection { AsynStreamSocketAcceptResult * pAcceptResult = (AsynStreamSocketAcceptResult *)result; AsynIoDevice * incomingDevice = pAcceptResult->GetIncomingSocket(); assert(incomingDevice); CConnection * incoming = this->Clone(); incoming->m_bIsPassive = true; int nRemoteAddrLen = 0; incoming->SetSocketDevice(incomingDevice); pAcceptResult->GetRemoteAddr(incoming->m_RemoteAddr,nRemoteAddrLen); // 继续accept下一个 device->Acceptor()->accept(this); //crr 出于线程安全放到执行CallBack的线程中去DeleteAsynIoResult // 删除result //device->DeleteAsynIoResult(result); // 通知应用层 CallbackDispatcher::getInstance().RequestCallback(new Callback_Accept(this,incoming,result)); break; } case ASYN_IO_CONNECT: // Connect OK RecvNextPackage(); // 删除result //device->DeleteAsynIoResult(result); // 通知应用层 CallbackDispatcher::getInstance().RequestCallback(new Callback_Connect(this,result)); break; case ASYN_IO_READ: // Data Recieve { AsynIoBuffer * pBuffer = result->GetBufferList(); assert(pBuffer && result->GetBufferCount()==1); LPVOID pData = pBuffer->buf; DWORD dwTransferedBytes = result->GetTransferredBytes(); if (dwTransferedBytes>0) { result->SetBuffer(0,0); // Detach The Buff //crr mod,默认采用的SimplePacker 会在开头两个字节记录本次发送数据的大小 //检查包接收是否完整,注意:有可能存在连包情况 //上一次接收到的包的开头部分 dwTransferedBytes += result->GetLastRecievedLen(); WORD wCurPacketSize = 0; DWORD dwRestDataLen = dwTransferedBytes; char* pCurPacket = (char*)pData; while (true) { if (dwRestDataLen < sizeof WORD) { //ErrorLn("包未接收完整 未接受simple packer的头2个字节"); break; } wCurPacketSize = *(WORD*)pCurPacket + sizeof WORD; if (dwRestDataLen < wCurPacketSize) { //ErrorLn("包未接收完整 大小< " << wCurPacketSize); break; } pCurPacket = pCurPacket + wCurPacketSize; dwRestDataLen -= wCurPacketSize; if (0 == dwRestDataLen) { break; } } if (dwRestDataLen == 0) { //单个包或多个连着的包接收完整 // 收下一个包 RecvNextPackage(); // 删除result //device->DeleteAsynIoResult(result); // 通知应用层 CallbackDispatcher::getInstance().RequestCallback(new Callback_Recv(this,pData,dwTransferedBytes, result)); } else { //最后一个包未接收完整 // 把这个包接收完整 RecvThisPackageRestData((LPVOID)pCurPacket, dwRestDataLen,wCurPacketSize); // 删除result //device->DeleteAsynIoResult(result); // 通知应用层 CallbackDispatcher::getInstance().RequestCallback(new Callback_Recv(this,pData,dwTransferedBytes - dwRestDataLen,result)); } }else { // 删除result //device->DeleteAsynIoResult(result); // 通知应用层 CallbackDispatcher::getInstance().RequestCallback(new Callback_TCP_Error(this,WSAECONNRESET, result)); } } break; case ASYN_IO_WRITE: // Send OK // 删除result device->DeleteAsynIoResult(result); break; case ASYN_IO_CLOSE: //crr 这里释放掉connection后,那些Callback 中引用到本this会出错 device->DeleteAsynIoResult(result); //CallbackDispatcher::getInstance().RequestCallback(new Callback_Release(this,WSAECONNRESET)); //ReleaseAux(); break; default: // 删除result device->DeleteAsynIoResult(result); break; } }else { // 投递出错信息 // 删除result //device->DeleteAsynIoResult(result); CallbackDispatcher::getInstance().RequestCallback(new Callback_TCP_Error(this,dwError, result)); } // 删除result(不能在这里删,要提前删,因为callback后该连接可能已经delete了) // device->DeleteAsynIoResult(result); }