diff options
Diffstat (limited to 'public/tier1/netadr.h')
| -rw-r--r-- | public/tier1/netadr.h | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/public/tier1/netadr.h b/public/tier1/netadr.h new file mode 100644 index 0000000..c15171f --- /dev/null +++ b/public/tier1/netadr.h @@ -0,0 +1,136 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// netadr.h +#ifndef NETADR_H +#define NETADR_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier0/platform.h" +#undef SetPort + +class bf_read; +class bf_write; + +typedef enum +{ + NA_NULL = 0, + NA_LOOPBACK, + NA_BROADCAST, + NA_IP, +} netadrtype_t; + +typedef struct netadr_s +{ +public: + netadr_s() { SetIP( 0 ); SetPort( 0 ); SetType( NA_IP ); } + netadr_s( uint unIP, uint16 usPort ) { SetIP( unIP ); SetPort( usPort ); SetType( NA_IP ); } + netadr_s( const char *pch ) { SetFromString( pch ); } + void Clear(); // invalids Address + + void SetType( netadrtype_t type ); + void SetPort( unsigned short port ); + bool SetFromSockadr(const struct sockaddr *s); + void SetIP(uint8 b1, uint8 b2, uint8 b3, uint8 b4); + void SetIP(uint unIP); // Sets IP. unIP is in host order (little-endian) + void SetIPAndPort( uint unIP, unsigned short usPort ) { SetIP( unIP ); SetPort( usPort ); } + bool SetFromString(const char *pch, bool bUseDNS = false ); // if bUseDNS is true then do a DNS lookup if needed + + bool CompareAdr (const netadr_s &a, bool onlyBase = false) const; + bool CompareClassBAdr (const netadr_s &a) const; + bool CompareClassCAdr (const netadr_s &a) const; + + netadrtype_t GetType() const; + unsigned short GetPort() const; + + // DON'T CALL THIS + const char* ToString( bool onlyBase = false ) const; // returns xxx.xxx.xxx.xxx:ppppp + + void ToString( char *pchBuffer, uint32 unBufferSize, bool onlyBase = false ) const; // returns xxx.xxx.xxx.xxx:ppppp + template< size_t maxLenInChars > + void ToString_safe( char (&pDest)[maxLenInChars], bool onlyBase = false ) const + { + ToString( &pDest[0], maxLenInChars, onlyBase ); + } + + void ToSockadr(struct sockaddr *s) const; + + // Returns 0xAABBCCDD for AA.BB.CC.DD on all platforms, which is the same format used by SetIP(). + // (So why isn't it just named GetIP()? Because previously there was a fucntion named GetIP(), and + // it did NOT return back what you put into SetIP(). So we nuked that guy.) + unsigned int GetIPHostByteOrder() const; + + // Returns a number that depends on the platform. In most cases, this probably should not be used. + unsigned int GetIPNetworkByteOrder() const; + + bool IsLocalhost() const; // true, if this is the localhost IP + bool IsLoopback() const; // true if engine loopback buffers are used + bool IsReservedAdr() const; // true, if this is a private LAN IP + bool IsValid() const; // ip & port != 0 + bool IsBaseAdrValid() const; // ip != 0 + + void SetFromSocket( int hSocket ); + + bool Unserialize( bf_read &readBuf ); + bool Serialize( bf_write &writeBuf ); + + bool operator==(const netadr_s &netadr) const {return ( CompareAdr( netadr ) );} + bool operator!=(const netadr_s &netadr) const {return !( CompareAdr( netadr ) );} + bool operator<(const netadr_s &netadr) const; + +public: // members are public to avoid to much changes + + netadrtype_t type; + unsigned char ip[4]; + unsigned short port; +} netadr_t; + + +/// Helper class to render a netadr_t. Use this when formatting a net address +/// in a printf. Don't use adr.ToString()! +class CUtlNetAdrRender +{ +public: + CUtlNetAdrRender( const netadr_t &obj, bool bBaseOnly = false ) + { + obj.ToString( m_rgchString, sizeof(m_rgchString), bBaseOnly ); + } + + CUtlNetAdrRender( uint32 unIP ) + { + netadr_t addr( unIP, 0 ); + addr.ToString( m_rgchString, sizeof(m_rgchString), true ); + } + + CUtlNetAdrRender( uint32 unIP, uint16 unPort ) + { + netadr_t addr( unIP, unPort ); + addr.ToString( m_rgchString, sizeof(m_rgchString), false ); + } + + CUtlNetAdrRender( const struct sockaddr &s ) + { + netadr_t addr; + if ( addr.SetFromSockadr( &s ) ) + addr.ToString( m_rgchString, sizeof(m_rgchString), false ); + else + m_rgchString[0] = '\0'; + } + + const char * String() const + { + return m_rgchString; + } + +private: + + char m_rgchString[32]; +}; + +#endif // NETADR_H |