/// Hook function that is called for all incoming messages from the server to the AO client. Message_t* DataBlockToMessageHook( int _Size, void* _pDataBlock ) { // Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days. DWORD time = GetTickCount(); if (time < g_lastTick) { // Overflow so just reset the g_lastTick g_lastTick = time; } if (time - g_lastTick > 10000) { // 10 sec since last update g_lastTick = time; LoadMessageFilter(HKEY_CURRENT_USER, "Software\\AOMessageHook\\MessageIDs"); } Header * msg = (Header*)_pDataBlock; unsigned int msgId = _byteswap_ulong(msg->msgid); if (g_messageFilter.size() == 0 || g_messageFilter.find(msgId) != g_messageFilter.end()) { DataItemPtr item(new DataItem(TYPE_INCOMING, _Size, (char*)_pDataBlock)); g_dataQueue.push(item); SetEvent(g_hEvent); } return pOriginalDataBlockToMessage( _Size, _pDataBlock ); }
/// Hook function that is called before a message is sent from the AO client to the server. void OnConnectionSend(void * connection, unsigned char * _msgData, unsigned int len) { Header * msg = (Header*)_msgData; unsigned int msgId = _byteswap_ulong(msg->msgid); if (msgId == 0x54111123 || msgId == 0x02)//move and keepalive { return; } LOG("OnConnectionSend( len: " << len << ", msgId: 0x" << std::hex << msgId); DataItemPtr item(new DataItem(TYPE_OUTGOIING, len, (char*)_msgData)); g_dataQueue.push(item); SetEvent(g_hEvent); }
void* TcpClient::responseFunc(TcpClient* arg) { TcpClient* pClient = (TcpClient*)arg; DataQueue recvDataQueue; int nDataLen(-1); while (!pClient->m_bStop) { char recvBuf[65535]; int nLen(pClient->getSocket()->recv(recvBuf, sizeof(recvBuf) / sizeof(char), 0)); if (nLen < 0) { } else { recvDataQueue.push(recvBuf, nLen); int nPos(0); int nPackage(recvDataQueue.getPos()); while (1) { if (nPackage <= 0) break; CodedInputStream* coded_input = new CodedInputStream((uint8_t*)(recvDataQueue.getBuf() + nPos), recvDataQueue.getPos() - nPos); autoptr<CodedInputStream> inputguard(coded_input); int nOldPos = coded_input->CurrentPosition(); uint32_t datalen; if (!coded_input->ReadVarint32(&datalen)) { if (nPos > 0) { recvDataQueue.pop(nPos); } break; } int nNewPos = coded_input->CurrentPosition(); if (nNewPos + datalen > nPackage) { //一个包没有收整 if (nPos > 0) { recvDataQueue.pop(nPos); } break; } else if (nNewPos + datalen == nPackage) { char* data = new char[datalen]; autoptr_arr<char> arrdata(data); if (coded_input->ReadRaw(data, datalen)) { OnPackage(data, datalen); } recvDataQueue.setPos(0); break; } else { char* data = new char[datalen]; autoptr_arr<char> arrdata(data); if (coded_input->ReadRaw(data, datalen)) { OnPackage(data, datalen); } nPackage -= (datalen+nNewPos-nOldPos); nPos += (datalen+nNewPos-nOldPos); } } } } return NULL; }