/// \file /// \brief A structure that holds all statistical data returned by RakNet. /// /// 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. #ifndef __RAK_NET_STATISTICS_H #define __RAK_NET_STATISTICS_H #include "PacketPriority.h" #include "Export.h" #include "RakNetTypes.h" /// \brief Network Statisics Usage /// /// Store Statistics information related to network usage struct RAK_DLL_EXPORT RakNetStatistics { /// Number of Messages in the send Buffer (high, medium, low priority) unsigned messageSendBuffer[ NUMBER_OF_PRIORITIES ]; /// Number of messages sent (high, medium, low priority) unsigned messagesSent[ NUMBER_OF_PRIORITIES ]; /// Number of data bits used for user messages uint64_t messageDataBitsSent[ NUMBER_OF_PRIORITIES ]; /// Number of total bits used for user messages, including headers uint64_t messageTotalBitsSent[ NUMBER_OF_PRIORITIES ]; /// Number of packets sent containing only acknowledgements unsigned packetsContainingOnlyAcknowlegements; /// Number of acknowledgements sent unsigned acknowlegementsSent; /// Number of acknowledgements waiting to be sent unsigned acknowlegementsPending; /// Number of acknowledgements bits sent uint64_t acknowlegementBitsSent; /// Number of packets containing only acknowledgements and resends unsigned packetsContainingOnlyAcknowlegementsAndResends; /// Number of messages resent unsigned messageResends; /// Number of bits resent of actual data uint64_t messageDataBitsResent; /// Total number of bits resent, including headers uint64_t messagesTotalBitsResent; /// Number of messages waiting for ack (// TODO - rename this) unsigned messagesOnResendQueue; /// Number of messages not split for sending unsigned numberOfUnsplitMessages; /// Number of messages split for sending unsigned numberOfSplitMessages; /// Total number of splits done for sending unsigned totalSplits; /// Total packets sent unsigned packetsSent; /// Number of bits added by encryption uint64_t encryptionBitsSent; /// total bits sent uint64_t totalBitsSent; /// Number of sequenced messages arrived out of order unsigned sequencedMessagesOutOfOrder; /// Number of sequenced messages arrived in order unsigned sequencedMessagesInOrder; /// Number of ordered messages arrived out of order unsigned orderedMessagesOutOfOrder; /// Number of ordered messages arrived in order unsigned orderedMessagesInOrder; /// Packets with a good CRC received unsigned packetsReceived; /// Packets with a bad CRC received unsigned packetsWithBadCRCReceived; /// Bits with a good CRC received uint64_t bitsReceived; /// Bits with a bad CRC received uint64_t bitsWithBadCRCReceived; /// Number of acknowledgement messages received for packets we are resending unsigned acknowlegementsReceived; /// Number of acknowledgement messages received for packets we are not resending unsigned duplicateAcknowlegementsReceived; /// Number of data messages (anything other than an ack) received that are valid and not duplicate unsigned messagesReceived; /// Number of data messages (anything other than an ack) received that are invalid unsigned invalidMessagesReceived; /// Number of data messages (anything other than an ack) received that are duplicate unsigned duplicateMessagesReceived; /// Number of messages waiting for reassembly unsigned messagesWaitingForReassembly; /// Number of messages in reliability output queue unsigned internalOutputQueueSize; /// Current bits per second double bitsPerSecond; /// connection start time RakNetTime connectionStartTime; // If true, not all the data can go out in one frame, and RakNet is sending continuously // RakNet will try to increase the bandwidth, so this condition may be temporary and only last a second. However, it if // stays on most of the time, you are at the maximum bandwidth and should slow down your sends, because other data is now waiting. bool bandwidthExceeded; RakNetStatistics operator +=(const RakNetStatistics& other) { unsigned i; for (i=0; i < NUMBER_OF_PRIORITIES; i++) { messageSendBuffer[i]+=other.messageSendBuffer[i]; messagesSent[i]+=other.messagesSent[i]; messageDataBitsSent[i]+=other.messageDataBitsSent[i]; messageTotalBitsSent[i]+=other.messageTotalBitsSent[i]; } packetsContainingOnlyAcknowlegements+=other.packetsContainingOnlyAcknowlegements; acknowlegementsSent+=other.packetsContainingOnlyAcknowlegements; acknowlegementsPending+=other.acknowlegementsPending; acknowlegementBitsSent+=other.acknowlegementBitsSent; packetsContainingOnlyAcknowlegementsAndResends+=other.packetsContainingOnlyAcknowlegementsAndResends; messageResends+=other.messageResends; messageDataBitsResent+=other.messageDataBitsResent; messagesTotalBitsResent+=other.messagesTotalBitsResent; messagesOnResendQueue+=other.messagesOnResendQueue; numberOfUnsplitMessages+=other.numberOfUnsplitMessages; numberOfSplitMessages+=other.numberOfSplitMessages; totalSplits+=other.totalSplits; packetsSent+=other.packetsSent; encryptionBitsSent+=other.encryptionBitsSent; totalBitsSent+=other.totalBitsSent; sequencedMessagesOutOfOrder+=other.sequencedMessagesOutOfOrder; sequencedMessagesInOrder+=other.sequencedMessagesInOrder; orderedMessagesOutOfOrder+=other.orderedMessagesOutOfOrder; orderedMessagesInOrder+=other.orderedMessagesInOrder; packetsReceived+=other.packetsReceived; packetsWithBadCRCReceived+=other.packetsWithBadCRCReceived; bitsReceived+=other.bitsReceived; bitsWithBadCRCReceived+=other.bitsWithBadCRCReceived; acknowlegementsReceived+=other.acknowlegementsReceived; duplicateAcknowlegementsReceived+=other.duplicateAcknowlegementsReceived; messagesReceived+=other.messagesReceived; invalidMessagesReceived+=other.invalidMessagesReceived; duplicateMessagesReceived+=other.duplicateMessagesReceived; messagesWaitingForReassembly+=other.messagesWaitingForReassembly; internalOutputQueueSize+=other.internalOutputQueueSize; return *this; } }; /// Verbosity level currently supports 0 (low), 1 (medium), 2 (high) /// \param[in] s The Statistical information to format out /// \param[in] buffer The buffer containing a formated report /// \param[in] verbosityLevel /// 0 low /// 1 medium /// 2 high void RAK_DLL_EXPORT StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel ); #endif