예제 #1
0
//接收完成函数
bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred)
{
	//效验数据
	ASSERT(m_bRecvIng==true);

	//设置变量
	m_bRecvIng=false;
	m_dwRecvTickCount=GetTickCount();

	//判断关闭
	if (m_hSocket==INVALID_SOCKET)
	{
		CloseSocket(m_wRountID);
		return true;
	}

	//接收数据
	int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0);
	if (iRetCode<=0)
	{
		CloseSocket(m_wRountID);
		return true;
	}

	//接收完成
	m_wRecvSize+=iRetCode;
	BYTE cbBuffer[SOCKET_BUFFER];
	CMD_Head * pHead=(CMD_Head *)m_cbRecvBuf;

	//处理数据
	try
	{
		while (m_wRecvSize>=sizeof(CMD_Head))
		{
			//效验数据
			WORD wPacketSize=pHead->CmdInfo.wPacketSize;
			if (wPacketSize>SOCKET_BUFFER) throw TEXT("数据包超长");
			if (wPacketSize<sizeof(CMD_Head)) throw TEXT("数据包非法");
			if (pHead->CmdInfo.cbVersion!=SOCKET_VER) throw TEXT("数据包版本错误");
			if (m_wRecvSize<wPacketSize) break;

			//提取数据
			CopyMemory(cbBuffer,m_cbRecvBuf,wPacketSize);
			WORD wRealySize=CrevasseBuffer(cbBuffer,wPacketSize);
			ASSERT(wRealySize>=sizeof(CMD_Head));
			m_dwRecvPacketCount++;

			//解释数据
			WORD wDataSize=wRealySize-sizeof(CMD_Head);
			void * pDataBuffer=cbBuffer+sizeof(CMD_Head);
			CMD_Command Command=((CMD_Head *)cbBuffer)->CommandInfo;

			//内核命令
			if (Command.wMainCmdID==MDM_KN_COMMAND)
			{
				switch (Command.wSubCmdID)
				{
				case SUB_KN_DETECT_SOCKET:	//网络检测
					{
						break;
					}
				default: throw TEXT("非法命令码");
				}
			}
			else 
			{
				//消息处理
				m_pIServerSocketItemSink->OnSocketReadEvent(Command,pDataBuffer,wDataSize,this);			
			}

			//删除缓存数据
			m_wRecvSize-=wPacketSize;
			MoveMemory(m_cbRecvBuf,m_cbRecvBuf+wPacketSize,m_wRecvSize);
		}
	}
	catch (...)
	{ 
		CloseSocket(m_wRountID);
		return false;
	}

	return RecvData();
}
예제 #2
0
bool CCNetDelegate::runReadByte()
{
    int nRet = m_oSocket.ccRead(m_pReadBuffer + m_wRecvSize, sizeof(m_pReadBuffer) - m_wRecvSize);
    if( nRet == eSocketIoError || nRet == eSocketIoClosed )
    {
        unregisterScheduler();
        m_oSocket.ccClose();
        m_eStatus = eSocketIoClosed;
        onDisconnected();
        return true;
    }
    else
    {
#if 1
        CCLOG("CCSOCKET READ %d", nRet);
#endif
        m_wRecvSize += nRet;
        BYTE cbDataBuffer[SOCKET_BUFFER+sizeof(CMD_Head)];
        WORD wPacketSize = 0;
        CMD_Head * pHead = (CMD_Head *)m_pReadBuffer;
        while( m_wRecvSize >= sizeof(CMD_Head) )
        {
            //效验参数
            wPacketSize = pHead->CmdInfo.wPacketSize;
            //            ASSERT(pHead->CmdInfo.cbVersion == SOCKET_VER);
            //            ASSERT(wPacketSize <= (SOCKET_BUFFER + sizeof(CMD_Head)));
            if (pHead->CmdInfo.cbVersion != SOCKET_VER) throw std::string("数据包版本错误");
            if (wPacketSize > (SOCKET_BUFFER + sizeof(CMD_Head))) throw std::string("数据包太大");
            if (m_wRecvSize < wPacketSize) return 1;
            
            //拷贝数据
            m_dwRecvPacketCount++;
            
            memcpy(cbDataBuffer, m_pReadBuffer, wPacketSize);
            m_wRecvSize -= wPacketSize;
            memcpy(m_pReadBuffer, m_pReadBuffer + wPacketSize, m_wRecvSize);
            
            //解密数据
            WORD wRealySize=CrevasseBuffer(cbDataBuffer,wPacketSize);
            
            //解释数据
            WORD wDataSize = wRealySize - sizeof(CMD_Head);
            void * pDataBuffer = cbDataBuffer + sizeof(CMD_Head);
            CMD_Command Command = ((CMD_Head *)cbDataBuffer)->CommandInfo;
            
            //内核命令
            if (Command.wMainCmdID == MDM_KN_COMMAND)
            {
                switch (Command.wSubCmdID)
                {
                    case SUB_KN_DETECT_SOCKET:	//网络检测
                    {
                        //发送数据
                        sendPacket(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize);
                        break;
                    }
                }
                continue;
            }
            
            //处理数据
            //            bool bSuccess = m_pITCPSocketSink->OnEventTCPSocketRead(GetSocketID(), Command, pDataBuffer, wDataSize);
            //            if (bSuccess == false) throw std::string("网络数据包处理失败");
            
            onMessageReceived((const char *)cbDataBuffer, wRealySize);
        }
    }
    return false;
}