mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-22 22:47:29 +08:00
344 lines
11 KiB
C++
344 lines
11 KiB
C++
/// \file
|
|
///
|
|
/// This file is part of RakNet Copyright 2003 Kevin Jenkins.
|
|
///
|
|
/// Usage of RakNet is subject to the appropriate license agreement.
|
|
/// Creative Commons Licensees are subject to the
|
|
/// license found at
|
|
/// http://creativecommons.org/licenses/by-nc/2.5/
|
|
/// Single application licensees are subject to the license found at
|
|
/// http://www.rakkarsoft.com/SingleApplicationLicense.html
|
|
/// Custom license users are subject to the terms therein.
|
|
/// GPL license users are subject to the GNU General Public
|
|
/// License as published by the Free
|
|
/// Software Foundation; either version 2 of the License, or (at your
|
|
/// option) any later version.
|
|
|
|
#include "PacketLogger.h"
|
|
#include "BitStream.h"
|
|
#include "DS_List.h"
|
|
#include "InternalPacket.h"
|
|
#include "RakPeerInterface.h"
|
|
#include "PacketEnumerations.h"
|
|
#include "StringCompressor.h"
|
|
#include "RPCMap.h"
|
|
#include "GetTime.h"
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning( push )
|
|
#endif
|
|
|
|
PacketLogger::PacketLogger()
|
|
{
|
|
rakPeer=0;
|
|
printId=true;
|
|
printAcks=true;
|
|
}
|
|
PacketLogger::~PacketLogger()
|
|
{
|
|
}
|
|
void PacketLogger::OnAttach(RakPeerInterface *peer)
|
|
{
|
|
rakPeer=peer;
|
|
}
|
|
void PacketLogger::OnDirectSocketSend(const char *data, const unsigned bitsUsed, PlayerID remoteSystemID)
|
|
{
|
|
char str[256];
|
|
PlayerID localPlayerId;
|
|
localPlayerId = rakPeer->GetInternalID();
|
|
|
|
if (printId==false)
|
|
{
|
|
sprintf(str, "Snd,Raw, NIL, NIL,%5i,%5i,%i,%u:%i,%u:%i\n", data[0], bitsUsed,RakNet::GetTime(),
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
{
|
|
sprintf(str, "Snd,Raw,NIL,NIL,%s,%i,%i,%u:%i,%u:%i\n",IDTOString(data[0]), bitsUsed,RakNet::GetTime(),
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
WriteLog(str);
|
|
}
|
|
|
|
void PacketLogger::LogHeader(void)
|
|
{
|
|
WriteLog("S|R,Typ,Pckt#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port\n");
|
|
}
|
|
void PacketLogger::OnDirectSocketReceive(const char *data, const unsigned bitsUsed, PlayerID remoteSystemID)
|
|
{
|
|
char str[256];
|
|
PlayerID localPlayerId;
|
|
localPlayerId = rakPeer->GetInternalID();
|
|
if (printId==false)
|
|
{
|
|
sprintf(str, "Rcv,Raw, NIL, NIL,%5i,%5i,%i,%u:%i,%u:%i\n", data[0], bitsUsed,RakNet::GetTime(),
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
{
|
|
sprintf(str, "Rcv,Raw,NIL,NIL,%s,%i,%i,%u:%i,%u:%i\n", IDTOString(data[0]), bitsUsed,RakNet::GetTime(),
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
|
|
WriteLog(str);
|
|
}
|
|
void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, PlayerID remoteSystemID, RakNetTime time, bool isSend)
|
|
{
|
|
char str[256];
|
|
char sendType[4];
|
|
PlayerID localPlayerId;
|
|
localPlayerId = rakPeer->GetInternalID();
|
|
|
|
if (isSend)
|
|
strcpy(sendType, "Snd");
|
|
else
|
|
strcpy(sendType, "Rcv");
|
|
|
|
// TODO - put this back in a different form
|
|
/*
|
|
if (internalPacket->isAcknowledgement)
|
|
{
|
|
if (printAcks)
|
|
{
|
|
if (printId==false)
|
|
sprintf(str, "%s,Ack,%5i,%5i, NIL, 1,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
else
|
|
sprintf(str, "%s,Ack,%i,%i,NIL,1,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
str[0]=0;
|
|
}
|
|
else
|
|
*/
|
|
{
|
|
if (internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]!=ID_RPC)
|
|
{
|
|
if (printId==false)
|
|
{
|
|
sprintf(str, "%s,Tms,%5i,%5i,%5i,%5i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
internalPacket->data[1+sizeof(int)], internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
{
|
|
sprintf(str, "%s,Tms,%i,%i,%s,%i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
IDTOString(internalPacket->data[1+sizeof(int)]), internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
|
|
}
|
|
else if (internalPacket->data[0]==ID_RPC || (internalPacket->dataBitLength>(sizeof(unsigned char)+sizeof(RakNetTime))*8 && internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]==ID_RPC))
|
|
{
|
|
bool hasTimestamp;
|
|
unsigned int bitsOfData;
|
|
bool nameIsEncoded;
|
|
unsigned char uniqueIdentifier[256];
|
|
RPCIndex rpcIndex;
|
|
RPCMap *rpcMap;
|
|
RakNet::BitStream rpcDecode(internalPacket->data, BITS_TO_BYTES(internalPacket->dataBitLength), false);
|
|
rpcDecode.IgnoreBits(8);
|
|
if (internalPacket->data[0]==ID_TIMESTAMP)
|
|
rpcDecode.IgnoreBits(sizeof(unsigned char)+sizeof(RakNetTime));
|
|
rpcDecode.Read(nameIsEncoded);
|
|
if (nameIsEncoded)
|
|
{
|
|
stringCompressor->DecodeString((char*)uniqueIdentifier, 256, &rpcDecode);
|
|
}
|
|
else
|
|
{
|
|
rpcDecode.ReadCompressed( rpcIndex );
|
|
RPCNode *rpcNode;
|
|
rpcMap = rakPeer->GetRPCMap(isSend==true ? remoteSystemID : UNASSIGNED_PLAYER_ID);
|
|
if (rpcMap)
|
|
rpcNode = rpcMap->GetNodeFromIndex(rpcIndex);
|
|
else
|
|
rpcNode=0;
|
|
|
|
if (rpcMap && rpcNode)
|
|
strcpy((char*)uniqueIdentifier, rpcNode->uniqueIdentifier);
|
|
else
|
|
strcpy((char*)uniqueIdentifier, "[UNKNOWN]");
|
|
}
|
|
rpcDecode.Read(hasTimestamp);
|
|
rpcDecode.ReadCompressed(bitsOfData);
|
|
|
|
if (hasTimestamp)
|
|
sprintf(str, "%s,RpT,%5i,%5i,%s,%5i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
uniqueIdentifier, internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
else
|
|
sprintf(str, "%s,Rpc,%5i,%5i,%s,%5i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
uniqueIdentifier, internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
{
|
|
if (printId==false)
|
|
{
|
|
sprintf(str, "%s,Nrm,%5i,%5i,%5i,%5i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
internalPacket->data[0], internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
else
|
|
{
|
|
sprintf(str, "%s,Nrm,%i,%i,%s,%i,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,
|
|
IDTOString(internalPacket->data[0]), internalPacket->dataBitLength,time,
|
|
localPlayerId.binaryAddress, localPlayerId.port, remoteSystemID.binaryAddress, remoteSystemID.port);
|
|
}
|
|
}
|
|
}
|
|
|
|
WriteLog(str);
|
|
}
|
|
void PacketLogger::WriteLog(const char *str)
|
|
{
|
|
//printf("%s", str);
|
|
}
|
|
void PacketLogger::SetPrintID(bool print)
|
|
{
|
|
printId=print;
|
|
}
|
|
void PacketLogger::SetPrintAcks(bool print)
|
|
{
|
|
printAcks=print;
|
|
}
|
|
char* PacketLogger::BaseIDTOString(unsigned char Id)
|
|
{
|
|
if (Id >= ID_RESERVED9)
|
|
return 0;
|
|
|
|
const char *IDTable[(int)ID_RESERVED9]=
|
|
{
|
|
"ID_INTERNAL_PING",
|
|
"ID_PING",
|
|
"ID_PING_OPEN_CONNECTIONS",
|
|
"ID_CONNECTED_PONG",
|
|
"ID_REQUEST_STATIC_DATA",
|
|
"ID_CONNECTION_REQUEST",
|
|
"ID_SECURED_CONNECTION_RESPONSE",
|
|
"ID_SECURED_CONNECTION_CONFIRMATION",
|
|
"ID_RPC_MAPPING",
|
|
"ID_DETECT_LOST_CONNECTIONS",
|
|
"ID_OPEN_CONNECTION_REQUEST",
|
|
"ID_OPEN_CONNECTION_REPLY",
|
|
"ID_RPC",
|
|
"ID_RPC_REPLY",
|
|
"ID_BROADCAST_PINGS",
|
|
"ID_SET_RANDOM_NUMBER_SEED",
|
|
"ID_CONNECTION_REQUEST_ACCEPTED",
|
|
"ID_CONNECTION_ATTEMPT_FAILED",
|
|
"ID_NEW_INCOMING_CONNECTION",
|
|
"ID_NO_FREE_INCOMING_CONNECTIONS",
|
|
"ID_DISCONNECTION_NOTIFICATION",
|
|
"ID_CONNECTION_LOST",
|
|
"ID_RSA_PUBLIC_KEY_MISMATCH",
|
|
"ID_CONNECTION_BANNED",
|
|
"ID_INVALID_PASSWORD",
|
|
"ID_MODIFIED_PACKET",
|
|
"ID_TIMESTAMP",
|
|
"ID_PONG",
|
|
"ID_RECEIVED_STATIC_DATA",
|
|
"ID_REMOTE_DISCONNECTION_NOTIFICATION",
|
|
"ID_REMOTE_CONNECTION_LOST",
|
|
"ID_REMOTE_NEW_INCOMING_CONNECTION",
|
|
"ID_REMOTE_EXISTING_CONNECTION",
|
|
"ID_REMOTE_STATIC_DATA",
|
|
"ID_FILE_LIST_TRANSFER_HEADER",
|
|
"ID_FILE_LIST_TRANSFER_FILE",
|
|
"ID_DDT_DOWNLOAD_REQUEST",
|
|
"ID_QUERY_MASTER_SERVER",
|
|
"ID_MASTER_SERVER_DELIST_SERVER",
|
|
"ID_MASTER_SERVER_UPDATE_SERVER",
|
|
"ID_MASTER_SERVER_SET_SERVER",
|
|
"ID_RELAYED_CONNECTION_NOTIFICATION",
|
|
"ID_ADVERTISE_SYSTEM",
|
|
"ID_TRANSPORT_STRING",
|
|
"ID_REPLICA_MANAGER_CONSTRUCTION",
|
|
"ID_REPLICA_MANAGER_DESTRUCTION",
|
|
"ID_REPLICA_MANAGER_SCOPE_CHANGE",
|
|
"ID_REPLICA_MANAGER_SERIALIZE",
|
|
"ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE",
|
|
"ID_CONNECTION_GRAPH_REQUEST",
|
|
"ID_CONNECTION_GRAPH_REPLY",
|
|
"ID_CONNECTION_GRAPH_UPDATE",
|
|
"ID_CONNECTION_GRAPH_NEW_CONNECTION",
|
|
"ID_CONNECTION_GRAPH_CONNECTION_LOST",
|
|
"ID_CONNECTION_GRAPH_DISCONNECTION_NOTIFICATION",
|
|
"ID_ROUTE_AND_MULTICAST",
|
|
"ID_RAKVOICE_OPEN_CHANNEL_REQUEST",
|
|
"ID_RAKVOICE_OPEN_CHANNEL_REPLY",
|
|
"ID_RAKVOICE_CLOSE_CHANNEL",
|
|
"ID_RAKVOICE_DATA",
|
|
"ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE",
|
|
"ID_AUTOPATCHER_CREATION_LIST",
|
|
"ID_AUTOPATCHER_DELETION_LIST",
|
|
"ID_AUTOPATCHER_GET_PATCH",
|
|
"ID_AUTOPATCHER_PATCH_LIST",
|
|
"ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR",
|
|
"ID_AUTOPATCHER_FINISHED",
|
|
"ID_AUTOPATCHER_RESTART_APPLICATION",
|
|
"ID_NAT_PUNCHTHROUGH_REQUEST",
|
|
"ID_NAT_TARGET_NOT_CONNECTED",
|
|
"ID_NAT_TARGET_CONNECTION_LOST",
|
|
"ID_NAT_CONNECT_AT_TIME",
|
|
"ID_NAT_SEND_OFFLINE_MESSAGE_AT_TIME",
|
|
"ID_DATABASE_QUERY_REQUEST",
|
|
"ID_DATABASE_UPDATE_ROW",
|
|
"ID_DATABASE_REMOVE_ROW",
|
|
"ID_DATABASE_QUERY_REPLY",
|
|
"ID_DATABASE_UNKNOWN_TABLE",
|
|
"ID_DATABASE_INCORRECT_PASSWORD",
|
|
|
|
};
|
|
|
|
return (char*)IDTable[Id];
|
|
}
|
|
#ifdef _MSC_VER
|
|
#pragma warning( disable : 4100 ) // warning C4100: <variable name> : unreferenced formal parameter
|
|
#endif
|
|
char* PacketLogger::UserIDTOString(unsigned char Id)
|
|
{
|
|
switch ( Id )
|
|
{
|
|
case ID_PLAYER_SYNC:
|
|
return "ID_PLAYER_SYNC";
|
|
case ID_VEHICLE_SYNC:
|
|
return "ID_VEHICLE_SYNC";
|
|
case ID_PASSENGER_SYNC:
|
|
return "ID_PASSENGER_SYNC";
|
|
case ID_AIM_SYNC:
|
|
return "ID_AIM_SYNC";
|
|
case ID_RCON_COMMAND:
|
|
return "ID_RCON_COMMAND";
|
|
case ID_RCON_RESPONCE:
|
|
return "ID_RCON_RESPONCE";
|
|
case ID_STATS_UPDATE:
|
|
return "ID_STATS_UPDATE";
|
|
case ID_WEAPONS_UPDATE:
|
|
return "ID_WEAPONS_UPDATE";
|
|
case ID_SPECTATOR_SYNC:
|
|
return "ID_SPECTATOR_SYNC";
|
|
case ID_TRAILER_SYNC:
|
|
return "ID_TRAILER_SYNC";
|
|
case ID_UNOCCUPIED_SYNC:
|
|
return "ID_UNOCCUPIED_SYNC";
|
|
}
|
|
return "Unknown";
|
|
}
|
|
char* PacketLogger::IDTOString(unsigned char Id)
|
|
{
|
|
char *out;
|
|
out=BaseIDTOString(Id);
|
|
if (out)
|
|
return (char*)out;
|
|
return UserIDTOString(Id);
|
|
}
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning( pop )
|
|
#endif
|