////////////////////////////////////////////////////////////////////// // // Crytek Network source code // // File: ipaddress.h // Description: ip address wrapper // // History: // -July 25,2001:Created by Alberto Demichelis // ////////////////////////////////////////////////////////////////////// #ifndef _IP_ADDRESS_H_ #define _IP_ADDRESS_H_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include #include "platform.h" #ifdef LINUX #include #include #include #include #include #endif //LINUX struct _SOCKADDR_IN { short sin_family; unsigned short sin_port; #if defined(LINUX) union { struct in_addr_windows sin_addr_win; struct in_addr sin_addr; }; #else struct in_addr sin_addr; #endif char sin_zero[8]; }; class CStream; #ifdef WIN32 #include #endif //WIN32 #ifdef PS2 #include #define PS2_MEM_SOCKET #endif //PS2 /* #ifdef _XBOX #include // #include #endif #ifndef PS2 struct _SOCKADDR_IN{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; #include #else #include //# define PS2_SONY_SOCKET #define PS2_MEM_SOCKET #endif */ inline unsigned short __ntohs(unsigned short us) { unsigned short nTemp=(us>>8)|(us<<8); return nTemp; } /* NOTE FOR PS2 PROGRAMMERS ABOUT THIS CLASS I rollback this file to our version because your change caused a bug inside our version. in your version you changed this m_Address.sin_addr.S_un.S_addr to this m_Address.sin_addr.S_addr but you also replaced m_Address.sin_port with m_Address.sin_addr.S_addr be careful because for some strange reason was partially working :) */ #if defined(LINUX) #define ADDR sin_addr_win.S_un.S_addr #else #define ADDR sin_addr.S_un.S_addr #endif class CIPAddress { public: CIPAddress(WORD wPort,const char *sAddress) { m_Address.sin_family = AF_INET; m_Address.sin_port = htons(wPort); m_Address.ADDR = inet_addr(sAddress); m_Address.sin_zero[0] = 0; if(m_Address.ADDR == INADDR_NONE) { struct hostent *pHostEntry; pHostEntry = gethostbyname(sAddress); if(pHostEntry) m_Address.ADDR = *(unsigned int *)pHostEntry->h_addr_list[0]; else m_Address.ADDR = 0; } } CIPAddress(sockaddr_in *sa) { memcpy(&m_Address, sa, sizeof(sockaddr_in)); } CIPAddress() { memset(&m_Address, 0, sizeof(sockaddr_in)); } CIPAddress(const CIPAddress &xa) { memcpy(&m_Address, &xa.m_Address, sizeof(sockaddr_in)); } virtual ~CIPAddress() { // delete &m_Address; } bool IsLocalHost() { if(m_Address.ADDR==inet_addr("127.0.0.1")) return true; return false; } inline void Set(WORD wPort, char *sAddress); inline void Set(WORD wPort, UINT dwAddress); inline void Set(sockaddr_in *sa); inline void Set(const CIPAddress &xa); UINT GetAsUINT() const; inline const CIPAddress& operator =(const CIPAddress& xa); inline bool operator !=(const CIPAddress& s1); inline bool operator ==(const CIPAddress& s1); inline bool operator <(const CIPAddress& s1) const ; inline char *GetAsString(bool bPort = false) const; inline bool Load(CStream &s); inline bool Save(CStream &s); public: struct _SOCKADDR_IN m_Address; }; inline void CIPAddress::Set(WORD wPort, char *sAddress) { m_Address.sin_family = AF_INET; m_Address.sin_port = htons(wPort); m_Address.ADDR = inet_addr(sAddress); m_Address.sin_zero[0] = 0; // win2003 server edition compatibility // the behaviour changed in this OS version // inet_addr returns INADDR_NONE instead of 0 when an empty string is passed. if(m_Address.ADDR == INADDR_NONE) { m_Address.ADDR = 0; } } inline void CIPAddress::Set(WORD wPort, UINT dwAddress) { m_Address.sin_family = AF_INET; m_Address.sin_port = htons(wPort); m_Address.ADDR = dwAddress; m_Address.sin_zero[0] = 0; } inline void CIPAddress::Set(sockaddr_in *sa) { memcpy(&m_Address, sa, sizeof(sockaddr_in)); } inline char *CIPAddress::GetAsString(bool bPort) const { static char s[64]; if (bPort) #ifndef LINUX wsprintf(s, "%i.%i.%i.%i:%i", m_Address.sin_addr.S_un.S_un_b.s_b1, m_Address.sin_addr.S_un.S_un_b.s_b2, m_Address.sin_addr.S_un.S_un_b.s_b3, m_Address.sin_addr.S_un.S_un_b.s_b4, __ntohs(m_Address.sin_port)); #else //LINUX sprintf(s, "%s:%i", inet_ntoa(m_Address.sin_addr), ntohs(m_Address.sin_port) ); #endif //LINUX else #ifndef LINUX wsprintf(s, "%i.%i.%i.%i", m_Address.sin_addr.S_un.S_un_b.s_b1, m_Address.sin_addr.S_un.S_un_b.s_b2, m_Address.sin_addr.S_un.S_un_b.s_b3, m_Address.sin_addr.S_un.S_un_b.s_b4); #else //LINUX sprintf(s, "%s", inet_ntoa(m_Address.sin_addr) ); //sprintf(s, "%i", InAddress()); #endif //LINUX return s; } inline UINT CIPAddress::GetAsUINT() const { return m_Address.ADDR; } inline void CIPAddress::Set(const CIPAddress &xa) { memcpy(&m_Address, &xa.m_Address, sizeof(_SOCKADDR_IN)); } inline bool CIPAddress::operator ==(const CIPAddress& s1) { return (!(memcmp(&s1.m_Address, &m_Address, sizeof(_SOCKADDR_IN))))?true:false; } inline bool CIPAddress::operator <(const CIPAddress& s1) const { if(s1.m_Address.ADDR