44 #ifndef COMMONCPP_ADDRESS_H_
45 #define COMMONCPP_ADDRESS_H_
47 #ifndef COMMONCPP_CONFIG_H_
48 #include <commoncpp/config.h>
51 #ifndef COMMONCPP_THREAD_H_
55 #ifndef COMMMONCPP_EXCEPTION_H_
63 #define INET_IPV4_ADDRESS_SIZE 16
64 #define CIDR_IPV4_ADDRESS_SIZE 32
65 #define INET_IPV6_ADDRESS_SIZE 40
66 #define CIDR_IPV6_ADDRESS_SIZE 45
69 #define InetAddress IPV4Address
70 #define InetHostAddress IPV4Host
71 #define InetMaskAddress IPV4Mask
72 #define InetMcastAddress IPV4Multicast
73 #define InetMcastAddressValidator IPV4MulticastValidator
74 #define InetAddrValidator IPV4Validator
75 #define BroadcastAddress IPV4Broadcast
92 class __EXPORT IPV4Validator
95 __DELETE_COPY(IPV4Validator);
106 virtual ~IPV4Validator() {}
113 operator()(
const in_addr address)
const = 0;
124 class __EXPORT IPV4MulticastValidator:
public IPV4Validator
127 __DELETE_COPY(IPV4MulticastValidator);
133 IPV4MulticastValidator(){}
138 virtual ~IPV4MulticastValidator(){}
144 void operator()(
const in_addr address)
const __OVERRIDE;
154 class __EXPORT IPV4Cidr
157 struct in_addr netmask, network;
159 unsigned getMask(
const char *cp)
const;
166 inline struct in_addr getNetwork(void) const {
175 inline struct in_addr getNetmask(void) const {
184 struct in_addr getBroadcast(void) const;
192 void set(
const char *cidr);
199 IPV4Cidr(
const char *cidr);
211 IPV4Cidr(IPV4Cidr &);
219 bool isMember(
const struct sockaddr *saddr)
const;
227 bool isMember(
const struct in_addr &inaddr)
const;
229 inline bool operator==(
const struct sockaddr *a)
const {
233 inline bool operator==(
const struct in_addr &a)
const {
237 inline bool operator!=(
const struct sockaddr *a)
const {
241 inline bool operator!=(
const struct in_addr &a)
const {
254 class __EXPORT IPV6Cidr
257 struct in6_addr netmask, network;
259 unsigned getMask(
const char *cp)
const;
266 inline struct in6_addr getNetwork(void) const {
275 inline struct in6_addr getNetmask(void) const {
284 struct in6_addr getBroadcast(void) const;
292 void set(
const char *cidr);
299 IPV6Cidr(
const char *cidr);
311 IPV6Cidr(IPV6Cidr &);
319 bool isMember(
const struct sockaddr *saddr)
const;
327 bool isMember(
const struct in6_addr &inaddr)
const;
329 inline bool operator==(
const struct sockaddr *sa)
const {
333 inline bool operator==(
const struct in6_addr &a)
const {
337 inline bool operator!=(
const struct sockaddr *sa)
const {
338 return !isMember(sa);
341 inline bool operator!=(
const struct in6_addr &a)
const {
362 class __EXPORT IPV4Address
370 const InetAddrValidator *validator;
373 struct in_addr * ipaddr;
375 mutable char* hostname;
376 #if defined(_MSWINDOWS_)
377 static MutexCounter counter;
388 bool setIPAddress(
const char *host);
396 void setAddress(
const char *host);
406 IPV4Address(
const InetAddrValidator *validator = NULL);
416 IPV4Address(
struct in_addr
addr,
const InetAddrValidator *validator = NULL);
428 IPV4Address(
const char *address,
const InetAddrValidator *validator = NULL);
433 IPV4Address(
const IPV4Address &rhs);
438 virtual ~IPV4Address();
446 const char *getHostname(
void)
const;
455 bool isInetAddress(
void)
const;
464 struct in_addr getAddress(void) const;
477 struct in_addr getAddress(size_t i) const;
484 size_t getAddressCount()
const {
return addr_count; }
486 IPV4Address &operator=(
const char *str);
487 IPV4Address &operator=(
struct in_addr
addr);
488 IPV4Address &operator=(
const IPV4Address &rhs);
494 IPV4Address &operator=(in_addr_t
addr);
496 inline operator bool()
const {
497 return isInetAddress();
500 inline bool operator!()
const {
501 return !isInetAddress();
512 bool operator==(
const IPV4Address &a)
const;
521 bool operator!=(
const IPV4Address &a)
const;
536 class __EXPORT IPV4Mask :
public IPV4Address
539 __DELETE_COPY(IPV4Mask);
548 IPV4Mask(
const char *mask);
560 friend __EXPORT IPV4Host operator&(
const IPV4Host &
addr,
const IPV4Mask &mask);
566 IPV4Address &operator=(in_addr_t
addr) {
567 return IPV4Address::operator =(
addr);
578 class __EXPORT IPV4Host :
public IPV4Address
581 static IPV4Host _host_;
596 IPV4Host(
const char *host = NULL);
605 IPV4Host(
struct in_addr
addr);
611 IPV4Address &operator=(in_addr_t
addr) {
612 return IPV4Address::operator =(
addr);
619 IPV4Host &operator&=(
const IPV4Mask &mask);
621 friend class IPV4Mask;
622 friend __EXPORT IPV4Host operator&(
const IPV4Host &
addr,
const IPV4Mask &mask);
629 class __EXPORT IPV4Broadcast :
public IPV4Address
639 IPV4Broadcast(
const char *net =
"255.255.255.255");
651 class __EXPORT IPV4Multicast:
public IPV4Address
666 IPV4Multicast(
const struct in_addr address);
677 IPV4Multicast(
const char *address);
687 static const IPV4MulticastValidator validator;
690 extern __EXPORT std::ostream& operator<<(std::ostream &os,
const IPV4Address &ia);
692 inline struct in_addr
getaddress(const IPV4Address &ia) {
693 return ia.getAddress();
709 class __EXPORT IPV6Validator
712 __DELETE_COPY(IPV6Validator);
723 virtual ~IPV6Validator() {}
729 virtual void operator()(
const in6_addr address)
const = 0;
740 class __EXPORT IPV6MulticastValidator:
public IPV6Validator
743 __DELETE_COPY(IPV6MulticastValidator);
749 IPV6MulticastValidator(){}
754 virtual ~IPV6MulticastValidator(){}
760 void operator()(
const in6_addr address)
const __OVERRIDE;
777 class __EXPORT IPV6Address
785 const IPV6Validator *validator;
788 struct in6_addr * ipaddr;
790 mutable char* hostname;
791 #if defined(_MSWINDOWS_)
792 static MutexCounter counter;
803 bool setIPAddress(
const char *host);
811 void setAddress(
const char *host);
821 IPV6Address(
const IPV6Validator *validator = NULL);
831 IPV6Address(
struct in6_addr
addr,
const IPV6Validator *validator = NULL);
843 IPV6Address(
const char *address,
const IPV6Validator *validator = NULL);
848 IPV6Address(
const IPV6Address &rhs);
853 virtual ~IPV6Address();
861 const char *getHostname(
void)
const;
870 bool isInetAddress(
void)
const;
879 struct in6_addr getAddress(void) const;
892 struct in6_addr getAddress(size_t i) const;
899 size_t getAddressCount()
const {
903 IPV6Address &operator=(
const char *str);
904 IPV6Address &operator=(
struct in6_addr
addr);
905 IPV6Address &operator=(
const IPV6Address &rhs);
907 inline operator bool ()
const {
908 return isInetAddress();
911 inline bool operator!()
const {
912 return !isInetAddress();
923 bool operator==(
const IPV6Address &a)
const;
932 bool operator!=(
const IPV6Address &a)
const;
947 class __EXPORT IPV6Mask :
public IPV6Address
950 __DELETE_COPY(IPV6Mask);
959 IPV6Mask(
const char *mask);
971 friend __EXPORT IPV6Host operator&(
const IPV6Host &
addr,
const IPV6Mask &mask);
981 class __EXPORT IPV6Host :
public IPV6Address
996 IPV6Host(
const char *host = NULL);
1005 IPV6Host(
struct in6_addr
addr);
1011 IPV6Host &operator&=(
const IPV6Mask &mask);
1013 friend class IPV6Mask;
1014 friend __EXPORT IPV6Host operator&(
const IPV6Host &
addr,
const IPV6Mask &mask);
1021 class __EXPORT IPV6Broadcast :
public IPV6Address
1031 IPV6Broadcast(
const char *net =
"255.255.255.255");
1043 class __EXPORT IPV6Multicast:
public IPV6Address
1058 IPV6Multicast(
const struct in6_addr address);
1069 IPV6Multicast(
const char *address);
1079 static const IPV6MulticastValidator validator;
1082 extern __EXPORT std::ostream& operator<<(std::ostream &os,
const IPV6Address &ia);
1084 inline struct in6_addr
getaddress(const IPV6Address &ia) {
1085 return ia.getAddress();