PacketLogger.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. #include "NativeFeatureIncludes.h"
  11. #if _RAKNET_SUPPORT_PacketLogger==1
  12. #include "PacketLogger.h"
  13. #include "BitStream.h"
  14. #include "DS_List.h"
  15. #include "InternalPacket.h"
  16. #include "RakPeerInterface.h"
  17. #include "MessageIdentifiers.h"
  18. #include "StringCompressor.h"
  19. #include "GetTime.h"
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include "Itoa.h"
  24. #include <time.h>
  25. #include "SocketIncludes.h"
  26. #include "gettimeofday.h"
  27. #ifdef _MSC_VER
  28. #pragma warning( push )
  29. #endif
  30. using namespace RakNet;
  31. STATIC_FACTORY_DEFINITIONS(PacketLogger,PacketLogger);
  32. PacketLogger::PacketLogger()
  33. {
  34. printId=true;
  35. printAcks=true;
  36. prefix[0]=0;
  37. suffix[0]=0;
  38. logDirectMessages=true;
  39. }
  40. PacketLogger::~PacketLogger()
  41. {
  42. }
  43. void PacketLogger::FormatLine(
  44. char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, unsigned char id
  45. , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
  46. unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
  47. {
  48. char numericID[16];
  49. const char* idToPrint = NULL;
  50. if(printId)
  51. {
  52. if (splitPacketCount>0 && splitPacketCount!=(unsigned int)-1)
  53. idToPrint="(SPLIT PACKET)";
  54. else
  55. idToPrint = IDTOString(id);
  56. }
  57. // If printId is false, idToPrint will be NULL, as it will
  58. // in the case of an unrecognized id. Testing printId for false
  59. // would just be redundant.
  60. if(idToPrint == NULL)
  61. {
  62. sprintf(numericID, "%5u", id);
  63. idToPrint = numericID;
  64. }
  65. FormatLine(into, dir, type, reliableMessageNumber, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex);
  66. }
  67. void PacketLogger::FormatLine(
  68. char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, const char* idToPrint
  69. , const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote,
  70. unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex)
  71. {
  72. char str1[64], str2[62];
  73. local.ToString(true, str1);
  74. remote.ToString(true, str2);
  75. char localtime[128];
  76. GetLocalTime(localtime);
  77. char str3[64];
  78. if (reliableMessageNumber==(unsigned int)-1)
  79. {
  80. str3[0]='N';
  81. str3[1]='/';
  82. str3[2]='A';
  83. str3[3]=0;
  84. }
  85. else
  86. {
  87. sprintf(str3,"%5u",reliableMessageNumber);
  88. }
  89. sprintf(into, "%s,%s%s,%s,%s,%5u,%s,%u,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,%i,%i,%i,%i,%s,"
  90. , localtime
  91. , prefix
  92. , dir
  93. , type
  94. , str3
  95. , frame
  96. , idToPrint
  97. , bitLen
  98. , time
  99. , str1
  100. , str2
  101. , splitPacketId
  102. , splitPacketIndex
  103. , splitPacketCount
  104. , orderingIndex
  105. , suffix
  106. );
  107. }
  108. void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
  109. {
  110. if (logDirectMessages==false)
  111. return;
  112. char str[256];
  113. FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTimeMS(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
  114. AddToLog(str);
  115. }
  116. void PacketLogger::LogHeader(void)
  117. {
  118. // Last 5 are splitpacket id, split packet index, split packet count, ordering index, suffix
  119. AddToLog("Clock,S|R,Typ,Reliable#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix,Miscellaneous\n");
  120. }
  121. void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
  122. {
  123. if (logDirectMessages==false)
  124. return;
  125. char str[256];
  126. FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
  127. AddToLog(str);
  128. }
  129. void PacketLogger::OnReliabilityLayerNotification(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress, bool isError)
  130. {
  131. char str[1024];
  132. char *type;
  133. if (isError)
  134. type=(char*) "RcvErr";
  135. else
  136. type=(char*) "RcvWrn";
  137. FormatLine(str, type, errorMessage, 0, 0, "", bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1);
  138. AddToLog(str);
  139. RakAssert(isError==false);
  140. }
  141. void PacketLogger::OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time)
  142. {
  143. char str[256];
  144. char str1[64], str2[62];
  145. SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
  146. localSystemAddress.ToString(true, str1);
  147. remoteSystemAddress.ToString(true, str2);
  148. char localtime[128];
  149. GetLocalTime(localtime);
  150. sprintf(str, "%s,Rcv,Ack,%i,,,,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,,,,,,"
  151. , localtime
  152. , messageNumber
  153. , (unsigned long long) time
  154. , str1
  155. , str2
  156. );
  157. AddToLog(str);
  158. }
  159. void PacketLogger::OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress)
  160. {
  161. char str[256];
  162. char str1[64], str2[62];
  163. SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
  164. localSystemAddress.ToString(true, str1);
  165. remoteSystemAddress.ToString(true, str2);
  166. RakNet::TimeMS time = RakNet::GetTimeMS();
  167. char localtime[128];
  168. GetLocalTime(localtime);
  169. sprintf(str, "%s,Lcl,PBP,,,%s,%i,%" PRINTF_64_BIT_MODIFIER "u,%s,%s,,,,,,"
  170. , localtime
  171. , BaseIDTOString(data[0])
  172. , bitsUsed
  173. , (unsigned long long) time
  174. , str1
  175. , str2
  176. );
  177. AddToLog(str);
  178. }
  179. void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend)
  180. {
  181. char str[256];
  182. const char *sendTypes[] =
  183. {
  184. "Rcv",
  185. "Snd",
  186. "Err1",
  187. "Err2",
  188. "Err3",
  189. "Err4",
  190. "Err5",
  191. "Err6",
  192. };
  193. const char *sendType = sendTypes[isSend];
  194. SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress);
  195. unsigned int reliableMessageNumber;
  196. if (internalPacket->reliability==UNRELIABLE || internalPacket->reliability==UNRELIABLE_SEQUENCED || internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT)
  197. reliableMessageNumber=(unsigned int)-1;
  198. else
  199. reliableMessageNumber=internalPacket->reliableMessageNumber;
  200. if (internalPacket->data[0]==ID_TIMESTAMP)
  201. {
  202. FormatLine(str, sendType, "Tms", reliableMessageNumber, frameNumber, internalPacket->data[1+sizeof(RakNet::Time)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
  203. }
  204. else
  205. {
  206. FormatLine(str, sendType, "Nrm", reliableMessageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex);
  207. }
  208. AddToLog(str);
  209. }
  210. void PacketLogger::AddToLog(const char *str)
  211. {
  212. WriteLog(str);
  213. }
  214. void PacketLogger::WriteLog(const char *str)
  215. {
  216. RAKNET_DEBUG_PRINTF("%s\n", str);
  217. }
  218. void PacketLogger::WriteMiscellaneous(const char *type, const char *msg)
  219. {
  220. char str[1024];
  221. char str1[64];
  222. SystemAddress localSystemAddress = rakPeerInterface->GetInternalID();
  223. localSystemAddress.ToString(true, str1);
  224. RakNet::TimeMS time = RakNet::GetTimeMS();
  225. char localtime[128];
  226. GetLocalTime(localtime);
  227. sprintf(str, "%s,Lcl,%s,,,,,%" PRINTF_64_BIT_MODIFIER "u,%s,,,,,,,%s"
  228. , localtime
  229. , type
  230. , (unsigned long long) time
  231. , str1
  232. , msg
  233. );
  234. AddToLog(msg);
  235. }
  236. void PacketLogger::SetPrintID(bool print)
  237. {
  238. printId=print;
  239. }
  240. void PacketLogger::SetPrintAcks(bool print)
  241. {
  242. printAcks=print;
  243. }
  244. const char* PacketLogger::BaseIDTOString(unsigned char Id)
  245. {
  246. if (Id >= ID_USER_PACKET_ENUM)
  247. return 0;
  248. const char *IDTable[((int)ID_USER_PACKET_ENUM)+1]=
  249. {
  250. "ID_CONNECTED_PING",
  251. "ID_UNCONNECTED_PING",
  252. "ID_UNCONNECTED_PING_OPEN_CONNECTIONS",
  253. "ID_CONNECTED_PONG",
  254. "ID_DETECT_LOST_CONNECTIONS",
  255. "ID_OPEN_CONNECTION_REQUEST_1",
  256. "ID_OPEN_CONNECTION_REPLY_1",
  257. "ID_OPEN_CONNECTION_REQUEST_2",
  258. "ID_OPEN_CONNECTION_REPLY_2",
  259. "ID_CONNECTION_REQUEST",
  260. "ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY",
  261. "ID_OUR_SYSTEM_REQUIRES_SECURITY",
  262. "ID_PUBLIC_KEY_MISMATCH",
  263. "ID_OUT_OF_BAND_INTERNAL",
  264. "ID_SND_RECEIPT_ACKED",
  265. "ID_SND_RECEIPT_LOSS",
  266. "ID_CONNECTION_REQUEST_ACCEPTED",
  267. "ID_CONNECTION_ATTEMPT_FAILED",
  268. "ID_ALREADY_CONNECTED",
  269. "ID_NEW_INCOMING_CONNECTION",
  270. "ID_NO_FREE_INCOMING_CONNECTIONS",
  271. "ID_DISCONNECTION_NOTIFICATION",
  272. "ID_CONNECTION_LOST",
  273. "ID_CONNECTION_BANNED",
  274. "ID_INVALID_PASSWORD",
  275. "ID_INCOMPATIBLE_PROTOCOL_VERSION",
  276. "ID_IP_RECENTLY_CONNECTED",
  277. "ID_TIMESTAMP",
  278. "ID_UNCONNECTED_PONG",
  279. "ID_ADVERTISE_SYSTEM",
  280. "ID_DOWNLOAD_PROGRESS",
  281. "ID_REMOTE_DISCONNECTION_NOTIFICATION",
  282. "ID_REMOTE_CONNECTION_LOST",
  283. "ID_REMOTE_NEW_INCOMING_CONNECTION",
  284. "ID_FILE_LIST_TRANSFER_HEADER",
  285. "ID_FILE_LIST_TRANSFER_FILE",
  286. "ID_FILE_LIST_REFERENCE_PUSH_ACK",
  287. "ID_DDT_DOWNLOAD_REQUEST",
  288. "ID_TRANSPORT_STRING",
  289. "ID_REPLICA_MANAGER_CONSTRUCTION",
  290. "ID_REPLICA_MANAGER_SCOPE_CHANGE",
  291. "ID_REPLICA_MANAGER_SERIALIZE",
  292. "ID_REPLICA_MANAGER_DOWNLOAD_STARTED",
  293. "ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE",
  294. "ID_RAKVOICE_OPEN_CHANNEL_REQUEST",
  295. "ID_RAKVOICE_OPEN_CHANNEL_REPLY",
  296. "ID_RAKVOICE_CLOSE_CHANNEL",
  297. "ID_RAKVOICE_DATA",
  298. "ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE",
  299. "ID_AUTOPATCHER_CREATION_LIST",
  300. "ID_AUTOPATCHER_DELETION_LIST",
  301. "ID_AUTOPATCHER_GET_PATCH",
  302. "ID_AUTOPATCHER_PATCH_LIST",
  303. "ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR",
  304. "ID_AUTOPATCHER_CANNOT_DOWNLOAD_ORIGINAL_UNMODIFIED_FILES",
  305. "ID_AUTOPATCHER_FINISHED_INTERNAL",
  306. "ID_AUTOPATCHER_FINISHED",
  307. "ID_AUTOPATCHER_RESTART_APPLICATION",
  308. "ID_NAT_PUNCHTHROUGH_REQUEST",
  309. "ID_NAT_CONNECT_AT_TIME",
  310. "ID_NAT_GET_MOST_RECENT_PORT",
  311. "ID_NAT_CLIENT_READY",
  312. "ID_NAT_TARGET_NOT_CONNECTED",
  313. "ID_NAT_TARGET_UNRESPONSIVE",
  314. "ID_NAT_CONNECTION_TO_TARGET_LOST",
  315. "ID_NAT_ALREADY_IN_PROGRESS",
  316. "ID_NAT_PUNCHTHROUGH_FAILED",
  317. "ID_NAT_PUNCHTHROUGH_SUCCEEDED",
  318. "ID_READY_EVENT_SET",
  319. "ID_READY_EVENT_UNSET",
  320. "ID_READY_EVENT_ALL_SET",
  321. "ID_READY_EVENT_QUERY",
  322. "ID_LOBBY_GENERAL",
  323. "ID_RPC_REMOTE_ERROR",
  324. "ID_RPC_PLUGIN",
  325. "ID_FILE_LIST_REFERENCE_PUSH",
  326. "ID_READY_EVENT_FORCE_ALL_SET",
  327. "ID_ROOMS_EXECUTE_FUNC",
  328. "ID_ROOMS_LOGON_STATUS",
  329. "ID_ROOMS_HANDLE_CHANGE",
  330. "ID_LOBBY2_SEND_MESSAGE",
  331. "ID_LOBBY2_SERVER_ERROR",
  332. "ID_FCM2_NEW_HOST",
  333. "ID_FCM2_REQUEST_FCMGUID",
  334. "ID_FCM2_RESPOND_CONNECTION_COUNT",
  335. "ID_FCM2_INFORM_FCMGUID",
  336. "ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT",
  337. "ID_FCM2_VERIFIED_JOIN_START",
  338. "ID_FCM2_VERIFIED_JOIN_CAPABLE",
  339. "ID_FCM2_VERIFIED_JOIN_FAILED",
  340. "ID_FCM2_VERIFIED_JOIN_ACCEPTED",
  341. "ID_FCM2_VERIFIED_JOIN_REJECTED",
  342. "ID_UDP_PROXY_GENERAL",
  343. "ID_SQLite3_EXEC",
  344. "ID_SQLite3_UNKNOWN_DB",
  345. "ID_SQLLITE_LOGGER",
  346. "ID_NAT_TYPE_DETECTION_REQUEST",
  347. "ID_NAT_TYPE_DETECTION_RESULT",
  348. "ID_ROUTER_2_INTERNAL",
  349. "ID_ROUTER_2_FORWARDING_NO_PATH",
  350. "ID_ROUTER_2_FORWARDING_ESTABLISHED",
  351. "ID_ROUTER_2_REROUTED",
  352. "ID_TEAM_BALANCER_INTERNAL",
  353. "ID_TEAM_BALANCER_REQUESTED_TEAM_FULL",
  354. "ID_TEAM_BALANCER_REQUESTED_TEAM_LOCKED",
  355. "ID_TEAM_BALANCER_TEAM_REQUESTED_CANCELLED",
  356. "ID_TEAM_BALANCER_TEAM_ASSIGNED",
  357. "ID_LIGHTSPEED_INTEGRATION",
  358. "ID_XBOX_LOBBY",
  359. "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS",
  360. "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS",
  361. "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE",
  362. "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE",
  363. "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT",
  364. "ID_TWO_WAY_AUTHENTICATION_NEGOTIATION",
  365. "ID_CLOUD_POST_REQUEST",
  366. "ID_CLOUD_RELEASE_REQUEST",
  367. "ID_CLOUD_GET_REQUEST",
  368. "ID_CLOUD_GET_RESPONSE",
  369. "ID_CLOUD_UNSUBSCRIBE_REQUEST",
  370. "ID_CLOUD_SERVER_TO_SERVER_COMMAND",
  371. "ID_CLOUD_SUBSCRIPTION_NOTIFICATION",
  372. "ID_LIB_VOICE",
  373. "ID_RELAY_PLUGIN",
  374. "ID_NAT_REQUEST_BOUND_ADDRESSES",
  375. "ID_NAT_RESPOND_BOUND_ADDRESSES",
  376. "ID_FCM2_UPDATE_USER_CONTEXT",
  377. "ID_RESERVED_3",
  378. "ID_RESERVED_4",
  379. "ID_RESERVED_5",
  380. "ID_RESERVED_6",
  381. "ID_RESERVED_7",
  382. "ID_RESERVED_8",
  383. "ID_RESERVED_9",
  384. "ID_USER_PACKET_ENUM"
  385. };
  386. return (char*)IDTable[Id];
  387. }
  388. const char* PacketLogger::UserIDTOString(unsigned char Id)
  389. {
  390. // Users should override this
  391. static char str[256];
  392. Itoa(Id, str, 10);
  393. return (const char*) str;
  394. }
  395. const char* PacketLogger::IDTOString(unsigned char Id)
  396. {
  397. const char *out;
  398. out=BaseIDTOString(Id);
  399. if (out)
  400. return out;
  401. return UserIDTOString(Id);
  402. }
  403. void PacketLogger::SetPrefix(const char *_prefix)
  404. {
  405. strncpy(prefix, _prefix, 255);
  406. prefix[255]=0;
  407. }
  408. void PacketLogger::SetSuffix(const char *_suffix)
  409. {
  410. strncpy(suffix, _suffix, 255);
  411. suffix[255]=0;
  412. }
  413. void PacketLogger::GetLocalTime(char buffer[128])
  414. {
  415. #if defined(_WIN32) && !defined(__GNUC__) && !defined(__GCCXML__)
  416. time_t rawtime;
  417. struct timeval tv;
  418. // If you get an arror about an incomplete type, just delete this file
  419. struct timezone tz;
  420. gettimeofday(&tv, &tz);
  421. // time ( &rawtime );
  422. rawtime=tv.tv_sec;
  423. struct tm * timeinfo;
  424. timeinfo = localtime ( &rawtime );
  425. strftime (buffer,128,"%x %X",timeinfo);
  426. char buff[32];
  427. sprintf(buff, ".%i", tv.tv_usec);
  428. strcat(buffer,buff);
  429. // Commented version puts the time first
  430. /*
  431. struct tm * timeinfo;
  432. timeinfo = localtime ( &rawtime );
  433. strftime (buffer,128,"%X",timeinfo);
  434. char buff[32];
  435. sprintf(buff, ".%i ", tv.tv_usec);
  436. strcat(buffer,buff);
  437. char buff2[32];
  438. strftime (buff2,32,"%x",timeinfo);
  439. strcat(buffer,buff2);
  440. */
  441. #else
  442. buffer[0]=0;
  443. #endif
  444. }
  445. void PacketLogger::SetLogDirectMessages(bool send)
  446. {
  447. logDirectMessages=send;
  448. }
  449. #ifdef _MSC_VER
  450. #pragma warning( pop )
  451. #endif
  452. #endif // _RAKNET_SUPPORT_*
粤ICP备19079148号