2025-04-27 07:49:33 -04:00

160 lines
5.5 KiB
C++

/*==========================================================================
*
* Copyright (C) 1998-2000 Microsoft Corporation. All Rights Reserved.
*
* File: IPAddress.h
* Content: IP address class
*
*
* History:
* Date By Reason
* ==== == ======
* 01/20/99 jtk Created
* 05/11/99 jtk Split out to make a base class
* 01/10/20000 rmt Updated to build with Millenium build process
* 03/22/20000 jtk Updated with changes to interface names
***************************************************************************/
#ifndef __IP_ADDRESS_H__
#define __IP_ADDRESS_H__
//**********************************************************************
// Constant definitions
//**********************************************************************
//**********************************************************************
// Macro definitions
//**********************************************************************
//**********************************************************************
// Structure definitions
//**********************************************************************
//
// forward structure references
//
//**********************************************************************
// Variable definitions
//**********************************************************************
//
// external variables
//
extern const WCHAR g_IPBroadcastAddress[];
extern const DWORD g_dwIPBroadcastAddressSize;
//**********************************************************************
// Function prototypes
//**********************************************************************
//**********************************************************************
// Class definition
//**********************************************************************
class CIPAddress : public CSocketAddress
{
public:
#undef DPF_MODNAME
#define DPF_MODNAME "CIPAddress::CIPAddress"
CIPAddress()
{
DBG_CASSERT( sizeof( &m_SocketAddress.IPSocketAddress ) == sizeof( SOCKADDR* ) );
m_iSocketAddressSize = sizeof( m_SocketAddress.IPSocketAddress );
m_SocketAddress.IPSocketAddress.sin_family = AF_INET;
m_iSocketProtocol = IPPROTO_UDP;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CIPAddress::~CIPAddress"
~CIPAddress()
{
DNASSERT( m_iSocketAddressSize == sizeof( m_SocketAddress.IPSocketAddress ) );
DNASSERT( m_SocketAddress.IPSocketAddress.sin_family == AF_INET );
DNASSERT( m_iSocketProtocol == IPPROTO_UDP );
}
void InitializeWithBroadcastAddress( void );
void SetAddressFromSOCKADDR( const SOCKADDR &Address, const INT_PTR iAddressSize );
HRESULT SocketAddressFromDP8Address( IDirectPlay8Address *const pDP8Address,
const SP_ADDRESS_TYPE AddressType );
IDirectPlay8Address *DP8AddressFromSocketAddress( void ) const;
INT_PTR CompareFunction( const CSocketAddress *const pOtherAddress ) const;
INT_PTR HashFunction( const INT_PTR HashBitcount ) const;
INT_PTR CompareToBaseAddress( const SOCKADDR *const pBaseAddress ) const;
HRESULT EnumAdapters( SPENUMADAPTERSDATA *const pEnumData ) const;
void GuidFromInternalAddressWithoutPort( GUID &OutputGuid ) const;
BOOL IsUndefinedHostAddress( void ) const;
void ChangeLoopBackToLocalAddress( const CSocketAddress *const pOtherSocketAddress );
WORD GetPort( void ) const { return m_SocketAddress.IPSocketAddress.sin_port; }
void SetPort( const WORD wPort ) { m_SocketAddress.IPSocketAddress.sin_port = wPort; }
//
// functions to create default addresses
//
IDirectPlay8Address *CreateBroadcastAddress( void );
IDirectPlay8Address *CreateListenAddress( void );
IDirectPlay8Address *CreateGenericAddress( void );
protected:
#undef DPF_MODNAME
#define DPF_MODNAME "CIPAddress::AddressFromGuid"
virtual void AddressFromGuid( const GUID &InputGuid, SOCKADDR &SocketAddress ) const
{
DBG_CASSERT( sizeof( InputGuid ) == sizeof( SocketAddress ) );
DecryptGuid( &InputGuid,
reinterpret_cast<GUID*>( &SocketAddress ),
&g_IPSPEncryptionGuid );
}
private:
void CopyInternalSocketAddressWithoutPort( SOCKADDR &AddressDestination ) const;
#undef DPF_MODNAME
#define DPF_MODNAME "CIPAddress::GuidFromAddress"
static void GuidFromAddress( GUID &OutputGuid, const SOCKADDR &SocketAddress )
{
const SOCKADDR_IN *pSocketAddress = reinterpret_cast<const SOCKADDR_IN*>( &SocketAddress );
DBG_CASSERT( sizeof( OutputGuid ) == sizeof( SocketAddress ) );
memcpy( &OutputGuid, &SocketAddress, ( sizeof( OutputGuid ) - sizeof( pSocketAddress->sin_zero ) ) );
memset( &( reinterpret_cast<BYTE*>( &OutputGuid )[ OFFSETOF( SOCKADDR_IN, sin_zero ) ] ), 0, sizeof( pSocketAddress->sin_zero ) );
DNASSERT( SinZeroIsZero( reinterpret_cast<SOCKADDR_IN*>( &OutputGuid ) ) );
EncryptGuid( &OutputGuid, &OutputGuid, &g_IPSPEncryptionGuid );
}
#undef DPF_MODNAME
#define DPF_MODNAME "CIPAddress::SinZeroIsZero"
static BOOL SinZeroIsZero( const SOCKADDR_IN *const pSocketAddress )
{
if ( ( ( reinterpret_cast<const DWORD*>( &pSocketAddress->sin_zero[ 0 ] )[ 0 ] == 0 ) &&
( reinterpret_cast<const DWORD*>( &pSocketAddress->sin_zero[ 0 ] )[ 1 ] == 0 ) ) != FALSE )
{
return TRUE;
}
return FALSE;
}
//
// make copy constructor and assignment operator private and unimplemented
// to prevent illegal copies from being made
//
CIPAddress( const CIPAddress & );
CIPAddress& operator=( const CIPAddress & );
};
#undef DPF_MODNAME
#endif // __IP_ADDRESS_H__