Exemple #1
0
/// 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 );
}
Exemple #2
0
/// 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;
}