• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

PacketLogger.cpp

Go to the documentation of this file.
00001 #include "NativeFeatureIncludes.h"
00002 #if _RAKNET_SUPPORT_PacketLogger==1
00003 
00004 #include "PacketLogger.h"
00005 #include "BitStream.h"
00006 #include "DS_List.h"
00007 #include "InternalPacket.h"
00008 #include "RakPeerInterface.h"
00009 #include "MessageIdentifiers.h"
00010 #include "StringCompressor.h"
00011 #include "RPCMap.h"
00012 #include "GetTime.h"
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <stdlib.h>
00016 #include "Itoa.h"
00017 #include <time.h>
00018 #include "SocketIncludes.h"
00019 #include "gettimeofday.h"
00020 
00021 #ifdef _MSC_VER
00022 #pragma warning( push )
00023 #endif
00024 
00025 PacketLogger::PacketLogger()
00026 {
00027         printId=true;
00028         printAcks=true;
00029         prefix[0]=0;
00030         suffix[0]=0;
00031         logDirectMessages=true;
00032 }
00033 PacketLogger::~PacketLogger()
00034 {
00035 }
00036 void PacketLogger::FormatLine(
00037 char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, unsigned char id
00038 , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
00039 unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
00040 {
00041         char numericID[16];
00042         const char* idToPrint = NULL;
00043         if(printId)
00044         {
00045                 if (splitPacketCount>0)
00046                         idToPrint="(SPLIT PACKET)";
00047                 else
00048                         idToPrint =     IDTOString(id);
00049         }
00050         // If printId is false, idToPrint will be NULL, as it will
00051         // in the case of an unrecognized id. Testing printId for false
00052         // would just be redundant.
00053         if(idToPrint == NULL)
00054         {
00055                 sprintf(numericID, "%5u", id);
00056                 idToPrint = numericID;
00057         }
00058 
00059         FormatLine(into, dir, type, packet, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex);
00060 }
00061 
00062 void PacketLogger::FormatLine(
00063 char* into, const char* dir, const char* type, unsigned int packet, unsigned int frame, const char* idToPrint
00064 , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
00065 unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
00066 {
00067         char str1[64], str2[62];
00068         local.ToString(true, str1);
00069         remote.ToString(true, str2);
00070         char localtime[128];
00071         GetLocalTime(localtime);
00072 
00073         sprintf(into, "%s,%s%s,%s,%5u,%5u,%s,%u,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,%i,%i,%i,%i,%s,"
00074                                         , localtime
00075                                         , prefix
00076                                         , dir
00077                                         , type
00078                                         , packet
00079                                         , frame
00080                                         , idToPrint
00081                                         , bitLen
00082                                         , time
00083                                         , str1
00084                                         , str2
00085                                         , splitPacketId
00086                                         , splitPacketIndex
00087                                         , splitPacketCount
00088                                         , orderingIndex
00089                                         , suffix
00090                                         );
00091 }
00092 void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00093 {
00094         if (logDirectMessages==false)
00095                 return;
00096 
00097         char str[256];
00098         FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00099         AddToLog(str);
00100 }
00101 
00102 void PacketLogger::LogHeader(void)
00103 {
00104         // Last 5 are splitpacket id, split packet index, split packet count, ordering index, suffix
00105         AddToLog("Clock,S|R,Typ,Pckt#,Frm #,PktID,BitLn,Time     ,Local IP:Port   ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix,Miscellaneous\n");
00106 }
00107 void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00108 {
00109         if (logDirectMessages==false)
00110                 return;
00111 
00112         char str[256];
00113         FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00114         AddToLog(str);
00115 }
00116 void PacketLogger::OnReliabilityLayerPacketError(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00117 {
00118         char str[1024];
00119         FormatLine(str, "RcvErr", errorMessage, 0, 0, "", bitsUsed, RakNet::GetTime(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
00120         AddToLog(str);
00121 }
00122 void PacketLogger::OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNetTime time)
00123 {
00124         char str[256];
00125         char str1[64], str2[62];
00126         SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00127         localSystemAddress.ToString(true, str1);
00128         remoteSystemAddress.ToString(true, str2);
00129         char localtime[128];
00130         GetLocalTime(localtime);
00131 
00132         sprintf(str, "%s,Rcv,Ack,%i,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,,"
00133                                         , localtime
00134                                         , messageNumber
00135                                         , (unsigned long long) time
00136                                         , str1
00137                                         , str2
00138                                         );
00139         AddToLog(str);
00140 }
00141 void PacketLogger::OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
00142 {
00143         char str[256];
00144         char str1[64], str2[62];
00145         SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00146         localSystemAddress.ToString(true, str1);
00147         remoteSystemAddress.ToString(true, str2);
00148         RakNetTime time = RakNet::GetTime();
00149         char localtime[128];
00150         GetLocalTime(localtime);
00151 
00152         sprintf(str, "%s,Lcl,PBP,,,%s,%i,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,,"
00153                                         , localtime
00154                                         , BaseIDTOString(data[0])
00155                                         , bitsUsed
00156                                         , (unsigned long long) time
00157                                         , str1
00158                                         , str2
00159                                         );
00160         AddToLog(str);
00161 }
00162 void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNetTime time, int isSend)
00163 {
00164         char str[256];
00165         const char *sendTypes[] =
00166         {
00167                 "Rcv",
00168                 "Snd",
00169                 "Err1",
00170                 "Err2",
00171                 "Err3",
00172                 "Err4",
00173                 "Err5",
00174                 "Err6",
00175         };
00176         const char *sendType = sendTypes[isSend];
00177         SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
00178 
00179         if (internalPacket->data[0]==ID_TIMESTAMP && internalPacket->data[sizeof(unsigned char)+sizeof(RakNetTime)]!=ID_RPC)
00180         {
00181                 FormatLine(str, sendType, "Tms", internalPacket->reliableMessageNumber, frameNumber, internalPacket->data[1+sizeof(RakNetTime)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00182         }
00183         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))
00184         {
00185                 const char *uniqueIdentifier = rakPeerInterface->GetRPCString((const char*) internalPacket->data, internalPacket->dataBitLength, isSend==1 ? remoteSystemAddress : UNASSIGNED_SYSTEM_ADDRESS);
00186 
00187                 if (internalPacket->data[0]==ID_TIMESTAMP)
00188                         FormatLine(str, sendType, "RpT", internalPacket->reliableMessageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00189                 else
00190                         FormatLine(str, sendType, "Rpc", internalPacket->reliableMessageNumber, frameNumber, uniqueIdentifier, internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00191         }
00192         else
00193         {
00194                 FormatLine(str, sendType, "Nrm", internalPacket->reliableMessageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
00195         }
00196 
00197         AddToLog(str);
00198 }
00199 void PacketLogger::AddToLog(const char *str)
00200 {
00201         WriteLog(str);
00202 }
00203 void PacketLogger::WriteLog(const char *str)
00204 {
00205         RAKNET_DEBUG_PRINTF("%s\n", str);
00206 }
00207 void PacketLogger::WriteMiscellaneous(const char *type, const char *msg)
00208 {
00209         char str[1024];
00210         char str1[64];
00211         SystemAddress localSystemAddress = rakPeerInterface->GetInternalID();
00212         localSystemAddress.ToString(true, str1);
00213         RakNetTime time = RakNet::GetTime();
00214         char localtime[128];
00215         GetLocalTime(localtime);
00216 
00217         sprintf(str, "%s,Lcl,%s,,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,,,,,,,%s"
00218                                         , localtime
00219                                         , type
00220                                         , (unsigned long long) time
00221                                         , str1
00222                                         , msg
00223                                         );
00224 
00225         AddToLog(msg);
00226 }
00227 void PacketLogger::SetPrintID(bool print)
00228 {
00229         printId=print;
00230 }
00231 void PacketLogger::SetPrintAcks(bool print)
00232 {
00233         printAcks=print;
00234 }
00235 const char* PacketLogger::BaseIDTOString(unsigned char Id)
00236 {
00237         if (Id >= ID_USER_PACKET_ENUM)
00238         return 0;
00239 
00240         const char *IDTable[((int)ID_USER_PACKET_ENUM)+1]=
00241         {
00242                 "ID_INTERNAL_PING",
00243                 "ID_PING",
00244                 "ID_PING_OPEN_CONNECTIONS",
00245                 "ID_CONNECTED_PONG",
00246                 "ID_CONNECTION_REQUEST",
00247                 "ID_SECURED_CONNECTION_RESPONSE",
00248                 "ID_SECURED_CONNECTION_CONFIRMATION",
00249                 "ID_RPC_MAPPING",
00250                 "ID_DETECT_LOST_CONNECTIONS",
00251                 "ID_OPEN_CONNECTION_REQUEST",
00252                 "ID_OPEN_CONNECTION_REPLY",
00253                 "ID_RPC",
00254                 "ID_RPC_REPLY",
00255                 "ID_OUT_OF_BAND_INTERNAL",
00256                 "ID_CONNECTION_REQUEST_ACCEPTED",
00257                 "ID_CONNECTION_ATTEMPT_FAILED",
00258                 "ID_ALREADY_CONNECTED",
00259                 "ID_NEW_INCOMING_CONNECTION",
00260                 "ID_NO_FREE_INCOMING_CONNECTIONS",
00261                 "ID_DISCONNECTION_NOTIFICATION",
00262                 "ID_CONNECTION_LOST",
00263                 "ID_RSA_PUBLIC_KEY_MISMATCH",
00264                 "ID_CONNECTION_BANNED",
00265                 "ID_INVALID_PASSWORD",
00266                 "ID_INCOMPATIBLE_PROTOCOL_VERSION",
00267                 "ID_IP_RECENTLY_CONNECTED",
00268                 "ID_MODIFIED_PACKET",
00269                 "ID_TIMESTAMP",
00270                 "ID_PONG",
00271                 "ID_ADVERTISE_SYSTEM",
00272                 "ID_REMOTE_DISCONNECTION_NOTIFICATION",
00273                 "ID_REMOTE_CONNECTION_LOST",
00274                 "ID_REMOTE_NEW_INCOMING_CONNECTION",
00275                 "ID_DOWNLOAD_PROGRESS",
00276                 "ID_FILE_LIST_TRANSFER_HEADER",
00277                 "ID_FILE_LIST_TRANSFER_FILE",
00278                 "ID_FILE_LIST_REFERENCE_PUSH_ACK",
00279                 "ID_DDT_DOWNLOAD_REQUEST",
00280                 "ID_TRANSPORT_STRING",
00281                 "ID_REPLICA_MANAGER_CONSTRUCTION",
00282                 "ID_REPLICA_MANAGER_DESTRUCTION",
00283                 "ID_REPLICA_MANAGER_SCOPE_CHANGE",
00284                 "ID_REPLICA_MANAGER_SERIALIZE",
00285                 "ID_REPLICA_MANAGER_DOWNLOAD_STARTED",
00286                 "ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE",
00287                 "ID_CONNECTION_GRAPH_REQUEST",
00288                 "ID_CONNECTION_GRAPH_REPLY",
00289                 "ID_CONNECTION_GRAPH_UPDATE",
00290                 "ID_CONNECTION_GRAPH_NEW_CONNECTION",
00291                 "ID_CONNECTION_GRAPH_CONNECTION_LOST",
00292                 "ID_CONNECTION_GRAPH_DISCONNECTION_NOTIFICATION",
00293                 "ID_ROUTE_AND_MULTICAST",
00294                 "ID_RAKVOICE_OPEN_CHANNEL_REQUEST",
00295                 "ID_RAKVOICE_OPEN_CHANNEL_REPLY",
00296                 "ID_RAKVOICE_CLOSE_CHANNEL",
00297                 "ID_RAKVOICE_DATA",
00298                 "ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE",
00299                 "ID_AUTOPATCHER_CREATION_LIST",
00300                 "ID_AUTOPATCHER_DELETION_LIST",
00301                 "ID_AUTOPATCHER_GET_PATCH",
00302                 "ID_AUTOPATCHER_PATCH_LIST",
00303                 "ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR",
00304                 "ID_AUTOPATCHER_FINISHED_INTERNAL",
00305                 "ID_AUTOPATCHER_FINISHED",
00306                 "ID_AUTOPATCHER_RESTART_APPLICATION",
00307                 "ID_NAT_PUNCHTHROUGH_REQUEST",
00308                 "ID_NAT_CONNECT_AT_TIME",
00309                 "ID_NAT_GET_MOST_RECENT_PORT",
00310                 "ID_NAT_CLIENT_READY",
00311                 "ID_NAT_TARGET_NOT_CONNECTED",
00312                 "ID_NAT_TARGET_UNRESPONSIVE",
00313                 "ID_NAT_CONNECTION_TO_TARGET_LOST",
00314                 "ID_NAT_ALREADY_IN_PROGRESS",
00315                 "ID_NAT_PUNCHTHROUGH_FAILED",
00316                 "ID_NAT_PUNCHTHROUGH_SUCCEEDED",
00317                 "ID_DATABASE_QUERY_REQUEST",
00318                 "ID_DATABASE_UPDATE_ROW",
00319                 "ID_DATABASE_REMOVE_ROW",
00320                 "ID_DATABASE_QUERY_REPLY",
00321                 "ID_DATABASE_UNKNOWN_TABLE",
00322                 "ID_DATABASE_INCORRECT_PASSWORD",
00323                 "ID_READY_EVENT_SET",
00324                 "ID_READY_EVENT_UNSET",
00325                 "ID_READY_EVENT_ALL_SET",
00326                 "ID_READY_EVENT_QUERY",
00327                 "ID_LOBBY_GENERAL",
00328                 "ID_AUTO_RPC_CALL",
00329                 "ID_AUTO_RPC_REMOTE_INDEX",
00330                 "ID_AUTO_RPC_UNKNOWN_REMOTE_INDEX",
00331                 "ID_RPC_REMOTE_ERROR",
00332                 "ID_FILE_LIST_REFERENCE_PUSH",
00333                 "ID_READY_EVENT_FORCE_ALL_SET",
00334                 "ID_ROOMS_EXECUTE_FUNC",
00335                 "ID_ROOMS_LOGON_STATUS",
00336                 "ID_ROOMS_HANDLE_CHANGE",
00337                 "ID_LOBBY2_SEND_MESSAGE",
00338                 "ID_LOBBY2_SERVER_ERROR",
00339                 "ID_FCM2_NEW_HOST",
00340                 "ID_FCM2_REQUEST_FCMGUID",
00341                 "ID_FCM2_RESPOND_CONNECTION_COUNT",
00342                 "ID_FCM2_INFORM_FCMGUID",
00343                 "ID_UDP_PROXY_GENERAL",
00344                 "ID_SQLite3_EXEC",
00345                 "ID_SQLite3_UNKNOWN_DB",
00346                 "ID_REPLICA_MANAGER_3_SERIALIZE_CONSTRUCTION_EXISTING",
00347                 "ID_REPLICA_MANAGER_3_LOCAL_CONSTRUCTION_REJECTED",
00348                 "ID_REPLICA_MANAGER_3_LOCAL_CONSTRUCTION_ACCEPTED",
00349                 "ID_NAT_TYPE_DETECTION_REQUEST",
00350                 "ID_NAT_TYPE_DETECTION_RESULT",
00351                 "ID_SQLLITE_LOGGER",
00352                 "ID_ROUTER_2_INTERNAL",
00353                 "ID_ROUTER_2_FORWARDING_NO_PATH",
00354                 "ID_ROUTER_2_REROUTED",
00355                 "ID_TEAM_BALANCER_INTERNAL",
00356                 "ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING",
00357                 "ID_TEAM_BALANCER_TEAMS_LOCKED",
00358                 "ID_TEAM_BALANCER_TEAM_ASSIGNED",
00359                 "ID_LIGHTSPEED_INTEGRATION",
00360                 "ID_RPC_4_PLUGIN",
00361                 "ID_SND_RECEIPT_ACKED",
00362                 "ID_SND_RECEIPT_LOSS",
00363                 "ID_RESERVED_5",
00364                 "ID_RESERVED_6",
00365                 "ID_RESERVED_7",
00366                 "ID_RESERVED_8",
00367                 "ID_RESERVED_9",
00368                 "ID_USER_PACKET_ENUM"
00369         };
00370 
00371         return (char*)IDTable[Id];
00372 }
00373 const char* PacketLogger::UserIDTOString(unsigned char Id)
00374 {
00375         // Users should override this
00376         static char str[256];
00377         Itoa(Id, str, 10);
00378         return (const char*) str;
00379 }
00380 const char* PacketLogger::IDTOString(unsigned char Id)
00381 {
00382         const char *out;
00383         out=BaseIDTOString(Id);
00384         if (out)
00385                 return out;
00386         return UserIDTOString(Id);
00387 }
00388 void PacketLogger::SetPrefix(const char *_prefix)
00389 {
00390         strncpy(prefix, _prefix, 255);
00391         prefix[255]=0;
00392 }
00393 void PacketLogger::SetSuffix(const char *_suffix)
00394 {
00395         strncpy(suffix, _suffix, 255);
00396         suffix[255]=0;
00397 }
00398 void PacketLogger::GetLocalTime(char buffer[128])
00399 {
00400 #if defined(_WIN32) && !defined(__GNUC__)  && !defined(__GCCXML__)
00401     time_t rawtime;
00402         struct timeval tv;
00403         // If you get an arror about an incomplete type, just delete this file
00404         struct timezone tz;
00405         gettimeofday(&tv, &tz);
00406         // time ( &rawtime );
00407         rawtime=tv.tv_sec;
00408 
00409         struct tm * timeinfo;
00410         timeinfo = localtime ( &rawtime );
00411         strftime (buffer,128,"%x %X",timeinfo);
00412         char buff[32];
00413         sprintf(buff, ".%i", tv.tv_usec);
00414         strcat(buffer,buff);
00415 
00416         // Commented version puts the time first
00417         /*
00418         struct tm * timeinfo;
00419         timeinfo = localtime ( &rawtime );
00420         strftime (buffer,128,"%X",timeinfo);
00421         char buff[32];
00422         sprintf(buff, ".%i ", tv.tv_usec);
00423         strcat(buffer,buff);
00424         char buff2[32];
00425         strftime (buff2,32,"%x",timeinfo);
00426         strcat(buffer,buff2);
00427         */
00428 #else
00429     buffer[0]=0;
00430 #endif
00431 }
00432 void PacketLogger::SetLogDirectMessages(bool send)
00433 {
00434         logDirectMessages=send;
00435 }
00436 
00437 #ifdef _MSC_VER
00438 #pragma warning( pop )
00439 #endif
00440 
00441 #endif // _RAKNET_SUPPORT_*

Generated on Thu Sep 30 2010 01:27:25 for RakNet by  doxygen 1.7.1