@ -16,7 +16,6 @@
# include "protocol.h"
# include "protocol.h"
class CAddress ;
class CAddrDB ;
class CAddrDB ;
class CInv ;
class CInv ;
class CRequestTracker ;
class CRequestTracker ;
@ -29,15 +28,7 @@ extern int nConnectTimeout;
inline unsigned int ReceiveBufferSize ( ) { return 1000 * GetArg ( " -maxreceivebuffer " , 10 * 1000 ) ; }
inline unsigned int ReceiveBufferSize ( ) { return 1000 * GetArg ( " -maxreceivebuffer " , 10 * 1000 ) ; }
inline unsigned int SendBufferSize ( ) { return 1000 * GetArg ( " -maxsendbuffer " , 10 * 1000 ) ; }
inline unsigned int SendBufferSize ( ) { return 1000 * GetArg ( " -maxsendbuffer " , 10 * 1000 ) ; }
inline unsigned short GetDefaultPort ( ) { return fTestNet ? 18333 : 8333 ; }
static const unsigned int PUBLISH_HOPS = 5 ;
static const unsigned int PUBLISH_HOPS = 5 ;
enum
{
NODE_NETWORK = ( 1 < < 0 ) ,
} ;
bool ConnectSocket ( const CAddress & addrConnect , SOCKET & hSocketRet , int nTimeout = nConnectTimeout ) ;
bool ConnectSocket ( const CAddress & addrConnect , SOCKET & hSocketRet , int nTimeout = nConnectTimeout ) ;
bool Lookup ( const char * pszName , std : : vector < CAddress > & vaddr , int nServices , int nMaxSolutions , bool fAllowLookup = false , int portDefault = 0 , bool fAllowPort = false ) ;
bool Lookup ( const char * pszName , std : : vector < CAddress > & vaddr , int nServices , int nMaxSolutions , bool fAllowLookup = false , int portDefault = 0 , bool fAllowPort = false ) ;
@ -55,222 +46,6 @@ bool BindListenPort(std::string& strError=REF(std::string()));
void StartNode ( void * parg ) ;
void StartNode ( void * parg ) ;
bool StopNode ( ) ;
bool StopNode ( ) ;
static const unsigned char pchIPv4 [ 12 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0xff , 0xff } ;
class CAddress
{
public :
uint64 nServices ;
unsigned char pchReserved [ 12 ] ;
unsigned int ip ;
unsigned short port ;
// disk and network only
unsigned int nTime ;
// memory only
unsigned int nLastTry ;
CAddress ( )
{
Init ( ) ;
}
CAddress ( unsigned int ipIn , unsigned short portIn = 0 , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
ip = ipIn ;
port = htons ( portIn = = 0 ? GetDefaultPort ( ) : portIn ) ;
nServices = nServicesIn ;
}
explicit CAddress ( const struct sockaddr_in & sockaddr , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
ip = sockaddr . sin_addr . s_addr ;
port = sockaddr . sin_port ;
nServices = nServicesIn ;
}
explicit CAddress ( const char * pszIn , int portIn , bool fNameLookup = false , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
Lookup ( pszIn , * this , nServicesIn , fNameLookup , portIn ) ;
}
explicit CAddress ( const char * pszIn , bool fNameLookup = false , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
Lookup ( pszIn , * this , nServicesIn , fNameLookup , 0 , true ) ;
}
explicit CAddress ( std : : string strIn , int portIn , bool fNameLookup = false , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
Lookup ( strIn . c_str ( ) , * this , nServicesIn , fNameLookup , portIn ) ;
}
explicit CAddress ( std : : string strIn , bool fNameLookup = false , uint64 nServicesIn = NODE_NETWORK )
{
Init ( ) ;
Lookup ( strIn . c_str ( ) , * this , nServicesIn , fNameLookup , 0 , true ) ;
}
void Init ( )
{
nServices = NODE_NETWORK ;
memcpy ( pchReserved , pchIPv4 , sizeof ( pchReserved ) ) ;
ip = INADDR_NONE ;
port = htons ( GetDefaultPort ( ) ) ;
nTime = 100000000 ;
nLastTry = 0 ;
}
IMPLEMENT_SERIALIZE
(
if ( fRead )
const_cast < CAddress * > ( this ) - > Init ( ) ;
if ( nType & SER_DISK )
READWRITE ( nVersion ) ;
if ( ( nType & SER_DISK ) | | ( nVersion > = 31402 & & ! ( nType & SER_GETHASH ) ) )
READWRITE ( nTime ) ;
READWRITE ( nServices ) ;
READWRITE ( FLATDATA ( pchReserved ) ) ; // for IPv6
READWRITE ( ip ) ;
READWRITE ( port ) ;
)
friend inline bool operator = = ( const CAddress & a , const CAddress & b )
{
return ( memcmp ( a . pchReserved , b . pchReserved , sizeof ( a . pchReserved ) ) = = 0 & &
a . ip = = b . ip & &
a . port = = b . port ) ;
}
friend inline bool operator ! = ( const CAddress & a , const CAddress & b )
{
return ( ! ( a = = b ) ) ;
}
friend inline bool operator < ( const CAddress & a , const CAddress & b )
{
int ret = memcmp ( a . pchReserved , b . pchReserved , sizeof ( a . pchReserved ) ) ;
if ( ret < 0 )
return true ;
else if ( ret = = 0 )
{
if ( ntohl ( a . ip ) < ntohl ( b . ip ) )
return true ;
else if ( a . ip = = b . ip )
return ntohs ( a . port ) < ntohs ( b . port ) ;
}
return false ;
}
std : : vector < unsigned char > GetKey ( ) const
{
CDataStream ss ;
ss . reserve ( 18 ) ;
ss < < FLATDATA ( pchReserved ) < < ip < < port ;
# if defined(_MSC_VER) && _MSC_VER < 1300
return std : : vector < unsigned char > ( ( unsigned char * ) & ss . begin ( ) [ 0 ] , ( unsigned char * ) & ss . end ( ) [ 0 ] ) ;
# else
return std : : vector < unsigned char > ( ss . begin ( ) , ss . end ( ) ) ;
# endif
}
struct sockaddr_in GetSockAddr ( ) const
{
struct sockaddr_in sockaddr ;
memset ( & sockaddr , 0 , sizeof ( sockaddr ) ) ;
sockaddr . sin_family = AF_INET ;
sockaddr . sin_addr . s_addr = ip ;
sockaddr . sin_port = port ;
return sockaddr ;
}
bool IsIPv4 ( ) const
{
return ( memcmp ( pchReserved , pchIPv4 , sizeof ( pchIPv4 ) ) = = 0 ) ;
}
bool IsRFC1918 ( ) const
{
return IsIPv4 ( ) & & ( GetByte ( 3 ) = = 10 | |
( GetByte ( 3 ) = = 192 & & GetByte ( 2 ) = = 168 ) | |
( GetByte ( 3 ) = = 172 & &
( GetByte ( 2 ) > = 16 & & GetByte ( 2 ) < = 31 ) ) ) ;
}
bool IsRFC3927 ( ) const
{
return IsIPv4 ( ) & & ( GetByte ( 3 ) = = 169 & & GetByte ( 2 ) = = 254 ) ;
}
bool IsLocal ( ) const
{
return IsIPv4 ( ) & & ( GetByte ( 3 ) = = 127 | |
GetByte ( 3 ) = = 0 ) ;
}
bool IsRoutable ( ) const
{
return IsValid ( ) & &
! ( IsRFC1918 ( ) | | IsRFC3927 ( ) | | IsLocal ( ) ) ;
}
bool IsValid ( ) const
{
// Clean up 3-byte shifted addresses caused by garbage in size field
// of addr messages from versions before 0.2.9 checksum.
// Two consecutive addr messages look like this:
// header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
// so if the first length field is garbled, it reads the second batch
// of addr misaligned by 3 bytes.
if ( memcmp ( pchReserved , pchIPv4 + 3 , sizeof ( pchIPv4 ) - 3 ) = = 0 )
return false ;
return ( ip ! = 0 & & ip ! = INADDR_NONE & & port ! = htons ( USHRT_MAX ) ) ;
}
unsigned char GetByte ( int n ) const
{
return ( ( unsigned char * ) & ip ) [ 3 - n ] ;
}
std : : string ToStringIPPort ( ) const
{
return strprintf ( " %u.%u.%u.%u:%u " , GetByte ( 3 ) , GetByte ( 2 ) , GetByte ( 1 ) , GetByte ( 0 ) , ntohs ( port ) ) ;
}
std : : string ToStringIP ( ) const
{
return strprintf ( " %u.%u.%u.%u " , GetByte ( 3 ) , GetByte ( 2 ) , GetByte ( 1 ) , GetByte ( 0 ) ) ;
}
std : : string ToStringPort ( ) const
{
return strprintf ( " %u " , ntohs ( port ) ) ;
}
std : : string ToString ( ) const
{
return strprintf ( " %u.%u.%u.%u:%u " , GetByte ( 3 ) , GetByte ( 2 ) , GetByte ( 1 ) , GetByte ( 0 ) , ntohs ( port ) ) ;
}
void print ( ) const
{
printf ( " CAddress(%s) \n " , ToString ( ) . c_str ( ) ) ;
}
} ;
enum
enum
{
{
MSG_TX = 1 ,
MSG_TX = 1 ,