|
|
//====== Copyright Valve Corporation, All rights reserved. ====================
//
// Purpose: misc networking utilities
//
//=============================================================================
#ifndef ISTEAMNETWORKINGUTILS
#define ISTEAMNETWORKINGUTILS
#ifdef _WIN32
#pragma once
#endif
#include "steamnetworkingtypes.h"
struct SteamDatagramRelayAuthTicket;
//-----------------------------------------------------------------------------
/// Misc networking utilities for checking the local networking environment
/// and estimating pings.
class ISteamNetworkingUtils { public:
/// Fetch current timestamp. These values never go backwards, and
/// the initial value is low enough that practically speaking it's
/// not necessary to worry about the value wrapping around.
virtual SteamNetworkingMicroseconds GetLocalTimestamp() = 0;
/// Check if the ping data of sufficient recency is available, and if
/// it's too old, start refreshing it.
///
/// Games that use the ping location information will typically
/// want to call this at boot time, to make sure all prerequisites
/// are ready. Especially since the first measurement might take
/// slightly longer than subsequent measurements.
///
/// Returns true if sufficiently recent data is already available.
///
/// Returns false if sufficiently recent data is not available. In this
/// case, ping measurement is initiated, if it is not already active.
/// (You cannot restart a measurement already in progress.)
///
/// A FIXME event will be posted when measurement is completed.
virtual bool CheckPingDataUpToDate( float flMaxAgeSeconds ) = 0;
/// Return location info for the current host. Returns the approximate
/// age of the data, in seconds, or -1 if no data is available.
/// Note that this might return an age older than the age of your game's
/// process, if the data was obtained before you game started.
///
/// This always return the most up-to-date information we have available
/// right now, even if we are in the middle of re-calculating ping times.
virtual float GetLocalPingLocation( SteamNetworkPingLocation_t &result ) = 0;
/// Return true if we are taking ping measurements to update our ping
/// location or select optimal routing. Ping measurement typically takes
/// a few seconds, perhaps up to 10 seconds.
virtual bool IsPingMeasurementInProgress() = 0;
/// Estimate the round-trip latency between two arbitrary locations, in
/// milliseconds. This is a conservative estimate, based on routing through
/// the relay network. For most basic connections based on SteamID,
/// this ping time will be pretty accurate, since it will be based on the
/// route likely to be actually used.
///
/// If a direct IP route is used (perhaps via NAT traversal), then the route
/// will be different, and the ping time might be better. Or it might actually
/// be a bit worse! Standard IP routing is frequently suboptimal!
///
/// but even in this case, the estimate obtained using this method is a
/// reasonable upper bound on the ping time. (Also it has the advantage
/// of returning immediately and not sending any packets.)
///
/// In a few cases we might not able to estimate the route. In this case
/// a negative value is returned. k_nSteamNetworkingPing_Failed means
/// the reason was because of some networking difficulty. (Failure to
/// ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
/// currently answer the question for some other reason.
virtual int EstimatePingTimeBetweenTwoLocations( const SteamNetworkPingLocation_t &location1, const SteamNetworkPingLocation_t &location2 ) = 0;
/// Same as EstimatePingTime, but assumes that one location is the local host.
/// This is a bit faster, especially if you need to calculate a bunch of
/// these in a loop to find the fastest one.
///
/// In rare cases this might return a slightly different estimate than combining
/// GetLocalPingLocation with EstimatePingTimeBetweenTwoLocations. That's because
/// this function uses a slightly more complete description
virtual int EstimatePingTimeFromLocalHost( const SteamNetworkPingLocation_t &remoteLocation ) = 0;
// FIXME:
//
// Check current internet connection status
//
// Low level ticket stuff. I need to get some advice and talk through how this should work
// or how best to tuck it away and make it transparent.
//
virtual bool ReceivedTicket( const void *pvTicket, int cbTicket, SteamDatagramRelayAuthTicket *pOutParsedTicket ) = 0; virtual bool HasTicketForServer( CSteamID steamID ) = 0; virtual uint32 GetIPForServerSteamIDFromTicket( CSteamID steamID ) = 0;
//
// Low level network config stuff I haven't figure out how best to tuck away.
// Dota and CSGO use it because we have gameservers in the datacenter, and
// we need this information to do region selection. But most games won't
// need it.
//
/// Fetch directly measured ping time from local host to a particular network PoP.
/// Most games will not need to call this.
virtual int GetPingToDataCenter( SteamNetworkingPOPID popID, SteamNetworkingPOPID *pViaRelayPoP ) = 0; virtual int GetDirectPingToPOP( SteamNetworkingPOPID popID ) = 0;
/// Get number of network PoPs in the config
virtual int GetPOPCount() = 0;
/// Get list of all POP IDs
virtual int GetPOPList( SteamNetworkingPOPID *list, int nListSz ) = 0; }; #define STEAMNETWORKINGUTILS_VERSION "SteamNetworkingUtils001"
/// Get ISteamNetworkingUtils object. This will eventually go in Steam_api.h with all the rest of its kin
STEAMDATAGRAMLIB_INTERFACE ISteamNetworkingUtils *SteamNetworkingUtils();
#endif // ISTEAMNETWORKINGUTILS
|