134 lines
4.5 KiB
C++
134 lines
4.5 KiB
C++
/*
|
|
* Copyright (c) 2014, Oculus VR, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
*/
|
|
|
|
/// \file
|
|
/// \brief A structure that holds all statistical data returned by RakNet.
|
|
///
|
|
|
|
|
|
|
|
#ifndef __RAK_NET_STATISTICS_H
|
|
#define __RAK_NET_STATISTICS_H
|
|
|
|
#include "PacketPriority.hpp"
|
|
#include "Export.hpp"
|
|
#include "RakNetTypes.hpp"
|
|
|
|
namespace RakNet
|
|
{
|
|
|
|
enum RNSPerSecondMetrics
|
|
{
|
|
/// How many bytes per pushed via a call to RakPeerInterface::Send()
|
|
USER_MESSAGE_BYTES_PUSHED,
|
|
|
|
/// How many user message bytes were sent via a call to RakPeerInterface::Send(). This is less than or equal to USER_MESSAGE_BYTES_PUSHED.
|
|
/// A message would be pushed, but not yet sent, due to congestion control
|
|
USER_MESSAGE_BYTES_SENT,
|
|
|
|
/// How many user message bytes were resent. A message is resent if it is marked as reliable, and either the message didn't arrive or the message ack didn't arrive.
|
|
USER_MESSAGE_BYTES_RESENT,
|
|
|
|
/// How many user message bytes were received, and returned to the user successfully.
|
|
USER_MESSAGE_BYTES_RECEIVED_PROCESSED,
|
|
|
|
/// How many user message bytes were received, but ignored due to data format errors. This will usually be 0.
|
|
USER_MESSAGE_BYTES_RECEIVED_IGNORED,
|
|
|
|
/// How many actual bytes were sent, including per-message and per-datagram overhead, and reliable message acks
|
|
ACTUAL_BYTES_SENT,
|
|
|
|
/// How many actual bytes were received, including overead and acks.
|
|
ACTUAL_BYTES_RECEIVED,
|
|
|
|
/// \internal
|
|
RNS_PER_SECOND_METRICS_COUNT
|
|
};
|
|
|
|
/// \brief Network Statisics Usage
|
|
///
|
|
/// Store Statistics information related to network usage
|
|
struct RAK_DLL_EXPORT RakNetStatistics
|
|
{
|
|
/// For each type in RNSPerSecondMetrics, what is the value over the last 1 second?
|
|
uint64_t valueOverLastSecond[RNS_PER_SECOND_METRICS_COUNT];
|
|
|
|
/// For each type in RNSPerSecondMetrics, what is the total value over the lifetime of the connection?
|
|
uint64_t runningTotal[RNS_PER_SECOND_METRICS_COUNT];
|
|
|
|
/// When did the connection start?
|
|
/// \sa RakNet::GetTimeUS()
|
|
RakNet::TimeUS connectionStartTime;
|
|
|
|
/// Is our current send rate throttled by congestion control?
|
|
/// This value should be true if you send more data per second than your bandwidth capacity
|
|
bool isLimitedByCongestionControl;
|
|
|
|
/// If \a isLimitedByCongestionControl is true, what is the limit, in bytes per second?
|
|
uint64_t BPSLimitByCongestionControl;
|
|
|
|
/// Is our current send rate throttled by a call to RakPeer::SetPerConnectionOutgoingBandwidthLimit()?
|
|
bool isLimitedByOutgoingBandwidthLimit;
|
|
|
|
/// If \a isLimitedByOutgoingBandwidthLimit is true, what is the limit, in bytes per second?
|
|
uint64_t BPSLimitByOutgoingBandwidthLimit;
|
|
|
|
/// For each priority level, how many messages are waiting to be sent out?
|
|
unsigned int messageInSendBuffer[NUMBER_OF_PRIORITIES];
|
|
|
|
/// For each priority level, how many bytes are waiting to be sent out?
|
|
double bytesInSendBuffer[NUMBER_OF_PRIORITIES];
|
|
|
|
/// How many messages are waiting in the resend buffer? This includes messages waiting for an ack, so should normally be a small value
|
|
/// If the value is rising over time, you are exceeding the bandwidth capacity. See BPSLimitByCongestionControl
|
|
unsigned int messagesInResendBuffer;
|
|
|
|
/// How many bytes are waiting in the resend buffer. See also messagesInResendBuffer
|
|
uint64_t bytesInResendBuffer;
|
|
|
|
/// Over the last second, what was our packetloss? This number will range from 0.0 (for none) to 1.0 (for 100%)
|
|
float packetlossLastSecond;
|
|
|
|
/// What is the average total packetloss over the lifetime of the connection?
|
|
float packetlossTotal;
|
|
|
|
RakNetStatistics& operator +=(const RakNetStatistics& other)
|
|
{
|
|
unsigned i;
|
|
for (i=0; i < NUMBER_OF_PRIORITIES; i++)
|
|
{
|
|
messageInSendBuffer[i]+=other.messageInSendBuffer[i];
|
|
bytesInSendBuffer[i]+=other.bytesInSendBuffer[i];
|
|
}
|
|
|
|
for (i=0; i < RNS_PER_SECOND_METRICS_COUNT; i++)
|
|
{
|
|
valueOverLastSecond[i]+=other.valueOverLastSecond[i];
|
|
runningTotal[i]+=other.runningTotal[i];
|
|
}
|
|
|
|
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
|
|
/// 3 debugging congestion control
|
|
void RAK_DLL_EXPORT StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel );
|
|
|
|
} // namespace RakNet
|
|
|
|
#endif
|