DarkflameServer/thirdparty/raknet/Source/RakNetStatistics.h
2021-12-05 18:54:36 +01:00

173 lines
6.8 KiB
C

/// \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