00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00046 #ifndef CCXX_ADDRESS_H_
00047 #define CCXX_ADDRESS_H_
00048
00049 #ifndef CCXX_MISSING_H_
00050 #include <cc++/missing.h>
00051 #endif
00052
00053 #ifndef CCXX_THREAD_H_
00054 #include <cc++/thread.h>
00055 #endif
00056
00057 #ifndef CCXX_EXCEPTION_H_
00058 #include <cc++/exception.h>
00059 #endif
00060
00061 #if defined(WIN32) && !defined(__CYGWIN32__)
00062 #define __WINSOCK__
00063 #include <winsock2.h>
00064 #endif
00065
00066 #ifdef CCXX_NAMESPACES
00067 namespace ost {
00068 #endif
00069
00070
00071
00072 #define InetAddress IPV4Address
00073 #define InetHostAddress IPV4Host
00074 #define InetMaskAddress IPV4Mask
00075 #define InetMcastAddress IPV4Multicast
00076 #define InetMcastAddressValidator IPV4MulticastValidator
00077 #define InetAddrValidator IPV4Validator
00078 #define BroadcastAddress IPV4Broadcast
00079
00083 typedef unsigned short tpport_t;
00084
00085 class __EXPORT IPV4Host;
00086
00095 class __EXPORT IPV4Validator
00096 {
00097 public:
00101 IPV4Validator() { };
00102
00107 virtual void
00108 operator()(const in_addr address) const = 0;
00109 };
00110
00119 class __EXPORT IPV4MulticastValidator: public IPV4Validator
00120 {
00121 public:
00125 IPV4MulticastValidator(){};
00126
00131 void operator()(const in_addr address) const;
00132 private:
00133 #if __BYTE_ORDER == __BIG_ENDIAN
00134 enum {
00135 MCAST_VALID_MASK = 0xF0000000,
00136 MCAST_VALID_VALUE = 0xE0000000
00137 };
00138 #else
00139 enum {
00140 MCAST_VALID_MASK = 0x000000F0,
00141 MCAST_VALID_VALUE = 0x000000E0
00142 };
00143 #endif
00144 };
00145
00160 class __EXPORT IPV4Address
00161 {
00162 private:
00163
00164
00165
00166
00167
00168 const InetAddrValidator *validator;
00169
00170 protected:
00171 struct in_addr * ipaddr;
00172 size_t addr_count;
00173 mutable char* hostname;
00174 #if defined(WIN32)
00175 static MutexCounter counter;
00176 #else
00177 static Mutex mutex;
00178 #endif
00179
00186 bool setIPAddress(const char *host);
00187
00194 void setAddress(const char *host);
00195
00196 public:
00204 IPV4Address(const InetAddrValidator *validator = NULL);
00205
00214 IPV4Address(struct in_addr addr, const InetAddrValidator *validator = NULL);
00215
00226 IPV4Address(const char *address, const InetAddrValidator *validator = NULL);
00227
00231 IPV4Address(const IPV4Address &rhs);
00232
00236 virtual ~IPV4Address();
00237
00244 const char *getHostname(void) const;
00245
00253 bool isInetAddress(void) const;
00254
00262 struct in_addr getAddress(void) const;
00263
00275 struct in_addr getAddress(size_t i) const;
00276
00282 size_t getAddressCount() const { return addr_count; }
00283
00284 IPV4Address &operator=(const char *str);
00285 IPV4Address &operator=(struct in_addr addr);
00286 IPV4Address &operator=(const IPV4Address &rhs);
00287
00292 IPV4Address &operator=(unsigned long addr);
00293
00294 inline IPV4Address &operator=(unsigned int addr)
00295 {return *this = (unsigned long) addr; }
00296
00297 inline bool operator!() const
00298 {return !isInetAddress();};
00299
00308 bool operator==(const IPV4Address &a) const;
00309
00317 bool operator!=(const IPV4Address &a) const;
00318 };
00319
00332 class __EXPORT IPV4Mask : public IPV4Address
00333 {
00334 public:
00341 IPV4Mask(const char *mask);
00342
00353 friend __EXPORT IPV4Host operator&(const IPV4Host &addr,
00354 const IPV4Mask &mask);
00355
00360 IPV4Address &operator=(unsigned long addr)
00361 { return IPV4Address::operator =(addr); }
00362 };
00363
00371 class __EXPORT IPV4Host : public IPV4Address
00372 {
00373 public:
00386 IPV4Host(const char *host = NULL);
00387
00395 IPV4Host(struct in_addr addr);
00396
00401 IPV4Address &operator=(unsigned long addr)
00402 { return IPV4Address::operator =(addr); }
00403
00408 IPV4Host &operator&=(const IPV4Mask &mask);
00409
00410 friend class __EXPORT IPV4Mask;
00411 friend __EXPORT IPV4Host operator&(const IPV4Host &addr,
00412 const IPV4Mask &mask);
00413 };
00414
00419 class __EXPORT IPV4Broadcast : public IPV4Address
00420 {
00421 public:
00429 IPV4Broadcast(const char *net = "255.255.255.255");
00430 };
00431
00441 class __EXPORT IPV4Multicast: public IPV4Address
00442 {
00443 public:
00448 IPV4Multicast();
00449
00456 IPV4Multicast(const struct in_addr address);
00457
00467 IPV4Multicast(const char *address);
00468
00469 private:
00477 static const IPV4MulticastValidator validator;
00478 };
00479
00480 extern __EXPORT std::ostream& operator<<(std::ostream &os, const IPV4Address &ia);
00481
00482 inline struct in_addr getaddress(const IPV4Address &ia)
00483 {return ia.getAddress();}
00484
00485
00486 #ifdef CCXX_IPV6
00487
00488 class __EXPORT IPV6Host;
00489
00498 class __EXPORT IPV6Validator
00499 {
00500 public:
00504 IPV6Validator() { };
00505
00510 virtual void
00511 operator()(const in6_addr address) const = 0;
00512 };
00513
00522 class __EXPORT IPV6MulticastValidator: public IPV6Validator
00523 {
00524 public:
00528 IPV6MulticastValidator(){};
00529
00534 inline void
00535 operator()(const in6_addr address) const;
00536 };
00537
00552 class __EXPORT IPV6Address
00553 {
00554 private:
00555
00556
00557
00558
00559
00560 const IPV6Validator *validator;
00561
00562 protected:
00563 struct in6_addr * ipaddr;
00564 size_t addr_count;
00565 mutable char* hostname;
00566 #if defined(WIN32)
00567 static MutexCounter counter;
00568 #else
00569 static Mutex mutex;
00570 #endif
00571
00578 bool setIPAddress(const char *host);
00579
00586 void setAddress(const char *host);
00587
00588 public:
00596 IPV6Address(const IPV6Validator *validator = NULL);
00597
00606 IPV6Address(struct in6_addr addr, const IPV6Validator *validator = NULL);
00607
00618 IPV6Address(const char *address, const IPV6Validator *validator = NULL);
00619
00623 IPV6Address(const IPV6Address &rhs);
00624
00628 virtual ~IPV6Address();
00629
00636 const char *getHostname(void) const;
00637
00645 bool isInetAddress(void) const;
00646
00654 struct in6_addr getAddress(void) const;
00655
00667 struct in6_addr getAddress(size_t i) const;
00668
00674 size_t getAddressCount() const { return addr_count; }
00675
00676 IPV6Address &operator=(const char *str);
00677 IPV6Address &operator=(struct in6_addr addr);
00678 IPV6Address &operator=(const IPV6Address &rhs);
00679
00680 inline bool operator!() const
00681 {return !isInetAddress();};
00682
00691 bool operator==(const IPV6Address &a) const;
00692
00700 bool operator!=(const IPV6Address &a) const;
00701 };
00702
00715 class __EXPORT IPV6Mask : public IPV6Address
00716 {
00717 public:
00724 IPV6Mask(const char *mask);
00725
00736 friend __EXPORT IPV6Host operator&(const IPV6Host &addr,
00737 const IPV6Mask &mask);
00738 };
00739
00747 class __EXPORT IPV6Host : public IPV6Address
00748 {
00749 public:
00762 IPV6Host(const char *host = NULL);
00763
00771 IPV6Host(struct in6_addr addr);
00772
00777 IPV6Host &operator&=(const IPV6Mask &mask);
00778
00779 friend class __EXPORT IPV6Mask;
00780 friend __EXPORT IPV6Host operator&(const IPV6Host &addr, const IPV6Mask &mask);
00781 };
00782
00787 class __EXPORT IPV6Broadcast : public IPV6Address
00788 {
00789 public:
00797 IPV6Broadcast(const char *net = "255.255.255.255");
00798 };
00799
00809 class __EXPORT IPV6Multicast: public IPV6Address
00810 {
00811 public:
00816 IPV6Multicast();
00817
00824 IPV6Multicast(const struct in6_addr address);
00825
00835 IPV6Multicast(const char *address);
00836
00837 private:
00845 static const IPV6MulticastValidator validator;
00846 };
00847
00848 extern __EXPORT std::ostream& operator<<(std::ostream &os, const IPV6Address &ia);
00849
00850 inline struct in6_addr getaddress(const IPV6Address &ia)
00851 {return ia.getAddress();}
00852
00853
00854 #endif
00855
00856 #ifdef CCXX_NAMESPACES
00857 }
00858 #endif
00859
00860 #endif
00861