mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-23 14:07:20 +00:00
307 lines
10 KiB
C++
307 lines
10 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.jenkinssoftware.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 "MessageIdentifiers.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;
|
||
|
prefix[0]=0;
|
||
|
suffix[0]=0;
|
||
|
}
|
||
|
PacketLogger::~PacketLogger()
|
||
|
{
|
||
|
}
|
||
|
void PacketLogger::OnAttach(RakPeerInterface *peer)
|
||
|
{
|
||
|
rakPeer=peer;
|
||
|
}
|
||
|
|
||
|
void PacketLogger::FormatLine(
|
||
|
char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, unsigned char id
|
||
|
, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
|
||
|
unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
|
||
|
{
|
||
|
char numericID[16];
|
||
|
const char* idToPrint = NULL;
|
||
|
if(printId)
|
||
|
{
|
||
|
if (splitPacketIndex>0 && splitPacketIndex!=(unsigned int) -1)
|
||
|
idToPrint="(SPLIT PACKET)";
|
||
|
else
|
||
|
idToPrint = IDTOString(id);
|
||
|
}
|
||
|
// If printId is false, idToPrint will be NULL, as it will
|
||
|
// in the case of an unrecognized id. Testing printId for false
|
||
|
// would just be redundant.
|
||
|
if(idToPrint == NULL)
|
||
|
{
|
||
|
sprintf(numericID, "%5u", id);
|
||
|
idToPrint = numericID;
|
||
|
}
|
||
|
|
||
|
FormatLine(into, dir, type, packet, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex);
|
||
|
}
|
||
|
|
||
|
void PacketLogger::FormatLine(
|
||
|
char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, const char* idToPrint
|
||
|
, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
|
||
|
unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
|
||
|
{
|
||
|
sprintf(into, "%s%s,%s,%5u,%5u,%s,%u,%" PRINTF_TIME_MODIFIER "u,%u:%u,%u:%u,%i,%i,%i,%i,%s"
|
||
|
, prefix
|
||
|
, dir
|
||
|
, type
|
||
|
, packet
|
||
|
, frame
|
||
|
, idToPrint
|
||
|
, bitLen
|
||
|
, time
|
||
|
, (unsigned int)local.binaryAddress
|
||
|
, (unsigned int)local.port
|
||
|
, (unsigned int)remote.binaryAddress
|
||
|
, (unsigned int)remote.port
|
||
|
, splitPacketId
|
||
|
, splitPacketIndex
|
||
|
, splitPacketCount
|
||
|
, orderingIndex
|
||
|
, suffix
|
||
|
);
|
||
|
}
|
||
|
void PacketLogger::Update(RakPeerInterface *peer)
|
||
|
{
|
||
|
(void) peer;
|
||
|
|
||
|
}
|
||
|
void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
|
||
|
{
|
||
|
char str[256];
|
||
|
FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeer->GetInternalID(), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
|
||
|
AddToLog(str);
|
||
|
}
|
||
|
|
||
|
void PacketLogger::LogHeader(void)
|
||
|
{
|
||
|
// Last 5 are splitpacket id, split packet index, split packet count, ordering index, suffix
|
||
|
AddToLog("S|R,Typ,Pckt#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix\n");
|
||
|
}
|
||
|
void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
|
||
|
{
|
||
|
char str[256];
|
||
|
FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeer->GetInternalID(), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
|
||
|
AddToLog(str);
|
||
|
}
|
||
|
|
||
|
void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNetTime time, bool isSend)
|
||
|
{
|
||
|
char str[256];
|
||
|
const char* sendType = (isSend) ? "Snd" : "Rcv";
|
||
|
SystemAddress localSystemAddress = rakPeer->GetInternalID();
|
||
|
|
||
|
// 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,
|
||
|
localSystemAddress.binaryAddress, localSystemAddress.port, remoteSystemAddress.binaryAddress, remoteSystemAddress.port);
|
||
|
else
|
||
|
sprintf(str, "%s,Ack,%i,%i,NIL,1,%i,%u:%i,%u:%i\n",sendType, internalPacket->messageNumber,frameNumber,time,
|
||
|
localSystemAddress.binaryAddress, localSystemAddress.port, remoteSystemAddress.binaryAddress, remoteSystemAddress.port);
|
||
|
}
|
||
|
else
|
||
|
str[0]=0;
|
||
|
}
|
||
|
else
|
||
|
*/
|
||
|
{
|
||
|
if (internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]!=ID_RPC)
|
||
|
{
|
||
|
FormatLine(str, sendType, "Tms", internalPacket->messageNumber, frameNumber, internalPacket->data[1+sizeof(int)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
|
||
|
}
|
||
|
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))
|
||
|
{
|
||
|
const char *uniqueIdentifier = rakPeer->GetRPCString((const char*) internalPacket->data, internalPacket->dataBitLength, isSend==true ? remoteSystemAddress : UNASSIGNED_SYSTEM_ADDRESS);
|
||
|
|
||
|
if (internalPacket->data[0]==ID_TIMESTAMP)
|
||
|
FormatLine(str, sendType, "RpT", internalPacket->messageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
|
||
|
else
|
||
|
FormatLine(str, sendType, "Rpc", internalPacket->messageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FormatLine(str, sendType, "Nrm", internalPacket->messageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
AddToLog(str);
|
||
|
}
|
||
|
void PacketLogger::AddToLog(const char *str)
|
||
|
{
|
||
|
WriteLog(str);
|
||
|
}
|
||
|
void PacketLogger::WriteLog(const char *str)
|
||
|
{
|
||
|
printf("%s\n", str);
|
||
|
}
|
||
|
void PacketLogger::SetPrintID(bool print)
|
||
|
{
|
||
|
printId=print;
|
||
|
}
|
||
|
void PacketLogger::SetPrintAcks(bool print)
|
||
|
{
|
||
|
printAcks=print;
|
||
|
}
|
||
|
const char* PacketLogger::BaseIDTOString(unsigned char Id)
|
||
|
{
|
||
|
if (Id >= ID_USER_PACKET_ENUM)
|
||
|
return 0;
|
||
|
|
||
|
const char *IDTable[(int)ID_USER_PACKET_ENUM]=
|
||
|
{
|
||
|
"ID_INTERNAL_PING",
|
||
|
"ID_PING",
|
||
|
"ID_PING_OPEN_CONNECTIONS",
|
||
|
"ID_CONNECTED_PONG",
|
||
|
"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_OUT_OF_BAND_INTERNAL",
|
||
|
"ID_CONNECTION_REQUEST_ACCEPTED",
|
||
|
"ID_CONNECTION_ATTEMPT_FAILED",
|
||
|
"ID_ALREADY_CONNECTED",
|
||
|
"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_ADVERTISE_SYSTEM",
|
||
|
"ID_REMOTE_DISCONNECTION_NOTIFICATION",
|
||
|
"ID_REMOTE_CONNECTION_LOST",
|
||
|
"ID_REMOTE_NEW_INCOMING_CONNECTION",
|
||
|
"ID_DOWNLOAD_PROGRESS",
|
||
|
"ID_FILE_LIST_TRANSFER_HEADER",
|
||
|
"ID_FILE_LIST_TRANSFER_FILE",
|
||
|
"ID_DDT_DOWNLOAD_REQUEST",
|
||
|
"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_INTERNAL",
|
||
|
"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",
|
||
|
"ID_READY_EVENT_SET",
|
||
|
"ID_READY_EVENT_UNSET",
|
||
|
"ID_READY_EVENT_ALL_SET",
|
||
|
"ID_READY_EVENT_QUERY",
|
||
|
"ID_LOBBY_GENERAL",
|
||
|
"ID_AUTO_RPC_CALL",
|
||
|
"ID_AUTO_RPC_REMOTE_INDEX",
|
||
|
"ID_AUTO_RPC_UNKNOWN_REMOTE_INDEX",
|
||
|
"ID_RPC_REMOTE_ERROR",
|
||
|
};
|
||
|
|
||
|
return (char*)IDTable[Id];
|
||
|
}
|
||
|
const char* PacketLogger::UserIDTOString(unsigned char Id)
|
||
|
{
|
||
|
(void) Id;
|
||
|
|
||
|
// Users should override this
|
||
|
return "Unknown";
|
||
|
}
|
||
|
const char* PacketLogger::IDTOString(unsigned char Id)
|
||
|
{
|
||
|
const char *out;
|
||
|
out=BaseIDTOString(Id);
|
||
|
if (out)
|
||
|
return out;
|
||
|
return UserIDTOString(Id);
|
||
|
}
|
||
|
void PacketLogger::SetPrefix(const char *_prefix)
|
||
|
{
|
||
|
strncpy(prefix, _prefix, 255);
|
||
|
prefix[255]=0;
|
||
|
}
|
||
|
void PacketLogger::SetSuffix(const char *_suffix)
|
||
|
{
|
||
|
strncpy(suffix, _suffix, 255);
|
||
|
suffix[255]=0;
|
||
|
}
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
#pragma warning( pop )
|
||
|
#endif
|