Example #1
0
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);
}