ksocketaddress.h00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef KSOCKETADDRESS_H
00026 #define KSOCKETADDRESS_H
00027
00028 #include <qstring.h>
00029 #include <qcstring.h>
00030
00031 #include <kdelibs_export.h>
00032
00033 struct sockaddr;
00034 struct sockaddr_in;
00035 struct sockaddr_in6;
00036 struct sockaddr_un;
00037
00038 namespace KNetwork {
00039
00040 class KIpAddress;
00041 class KSocketAddress;
00042 class KInetSocketAddress;
00043 class KUnixSocketAddress;
00044
00062 class KDECORE_EXPORT KIpAddress
00063 {
00064 public:
00069 inline KIpAddress() : m_version(0)
00070 { }
00071
00080 inline KIpAddress(const KIpAddress& other)
00081 { *this = other; }
00082
00090 inline KIpAddress(const QString& addr)
00091 { setAddress(addr); }
00092
00100 inline KIpAddress(const char* addr)
00101 { setAddress(addr); }
00102
00109 inline KIpAddress(const void* addr, int version = 4)
00110 { setAddress(addr, version); }
00111
00122 inline KIpAddress(Q_UINT32 ip4addr)
00123 { setAddress(&ip4addr, 4); }
00124
00131 inline ~KIpAddress()
00132 { }
00133
00141 KIpAddress& operator =(const KIpAddress& other);
00142
00148 inline bool operator ==(const KIpAddress& other) const
00149 { return compare(other, true); }
00150
00164 bool compare(const KIpAddress& other, bool checkMapped = true) const;
00165
00171 inline int version() const
00172 { return m_version; }
00173
00177 inline bool isIPv4Addr() const
00178 { return version() == 4; }
00179
00183 inline bool isIPv6Addr() const
00184 { return version() == 6; }
00185
00192 bool setAddress(const QString& address);
00193
00200 bool setAddress(const char* address);
00201
00210 bool setAddress(const void* raw, int version = 4);
00211
00215 QString toString() const;
00216
00220 inline const void *addr() const
00221 { return m_data; }
00222
00235 inline Q_UINT32 IPv4Addr(bool convertMapped = true) const
00236 {
00237 return (convertMapped && isV4Mapped()) ? m_data[3] : m_data[0];
00238 }
00239
00248 Q_UINT32 hostIPv4Addr(bool convertMapped = true) const;
00249
00250 public:
00251
00252
00256 inline bool isUnspecified() const
00257 { return version() == 0 ? true : (*this == anyhostV4 || *this == anyhostV6); }
00258
00262 inline bool isLocalhost() const
00263 { return version() == 0 ? false : (*this == localhostV4 || *this == localhostV6); }
00264
00268 inline bool isLoopback() const
00269 { return isLocalhost(); }
00270
00277 inline bool isClassA() const
00278 { return version() != 4 ? false : (hostIPv4Addr() & 0x80000000) == 0; }
00279
00286 inline bool isClassB() const
00287 { return version() != 4 ? false : (hostIPv4Addr() & 0xc0000000) == 0x80000000; }
00288
00295 inline bool isClassC() const
00296 { return version() != 4 ? false : (hostIPv4Addr() & 0xe0000000) == 0xc0000000; }
00297
00304 inline bool isClassD() const
00305 { return version() != 4 ? false : (hostIPv4Addr() & 0xf0000000) == 0xe0000000; }
00306
00310 inline bool isMulticast() const
00311 {
00312 if (version() == 4) return isClassD();
00313 if (version() == 6) return ((Q_UINT8*)addr())[0] == 0xff;
00314 return false;
00315 }
00316
00320 inline bool isLinkLocal() const
00321 {
00322 if (version() != 6) return false;
00323 Q_UINT8* addr = (Q_UINT8*)this->addr();
00324 return (addr[0] & 0xff) == 0xfe &&
00325 (addr[1] & 0xc0) == 0x80;
00326 }
00327
00331 inline bool isSiteLocal() const
00332 {
00333 if (version() != 6) return false;
00334 Q_UINT8* addr = (Q_UINT8*)this->addr();
00335 return (addr[0] & 0xff) == 0xfe &&
00336 (addr[1] & 0xc0) == 0xc0;
00337 }
00338
00342 inline bool isGlobal() const
00343 { return version() != 6 ? false : !(isMulticast() || isLinkLocal() || isSiteLocal()); }
00344
00348 inline bool isV4Mapped() const
00349 {
00350 if (version() != 6) return false;
00351 Q_UINT32* addr = (Q_UINT32*)this->addr();
00352 return addr[0] == 0 && addr[1] == 0 &&
00353 ((Q_UINT16*)&addr[2])[0] == 0 &&
00354 ((Q_UINT16*)&addr[2])[1] == 0xffff;
00355 }
00356
00360 inline bool isV4Compat() const
00361 {
00362 if (version() != 6 || isLocalhost()) return false;
00363 Q_UINT32* addr = (Q_UINT32*)this->addr();
00364 return addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] != 0;
00365 }
00366
00370 inline bool isMulticastNodeLocal() const
00371 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x1; }
00372
00376 inline bool isMulticastLinkLocal() const
00377 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x2; }
00378
00382 inline bool isMulticastSiteLocal() const
00383 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x5; }
00384
00388 inline bool isMulticastOrgLocal() const
00389 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x8; }
00390
00394 inline bool isMulticastGlobal() const
00395 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0xe; }
00396
00397 protected:
00398 Q_UINT32 m_data[4];
00399
00400 char m_version;
00401
00402 public:
00404 static const KIpAddress localhostV4;
00406 static const KIpAddress anyhostV4;
00407
00409 static const KIpAddress localhostV6;
00411 static const KIpAddress anyhostV6;
00412 };
00413
00414
00415 class KSocketAddressData;
00423 class KDECORE_EXPORT KSocketAddress
00424 {
00425 public:
00431 KSocketAddress();
00432
00440 KSocketAddress(const sockaddr* sa, Q_UINT16 len);
00441
00450 KSocketAddress(const KSocketAddress& other);
00451
00455 virtual ~KSocketAddress();
00456
00463 KSocketAddress& operator =(const KSocketAddress& other);
00464
00472 const sockaddr* address() const;
00473
00484 sockaddr* address();
00485
00493 KSocketAddress& setAddress(const sockaddr *sa, Q_UINT16 len);
00494
00499 inline operator const sockaddr*() const
00500 { return address(); }
00501
00505 Q_UINT16 length() const;
00506
00527 KSocketAddress& setLength(Q_UINT16 len);
00528
00533 int family() const;
00534
00543 virtual KSocketAddress& setFamily(int family);
00544
00550 inline int ianaFamily() const
00551 { return ianaFamily(family()); }
00552
00561 bool operator ==(const KSocketAddress& other) const;
00562
00572 virtual QString nodeName() const;
00573
00583 virtual QString serviceName() const;
00584
00591 virtual QString toString() const;
00592
00597 KInetSocketAddress& asInet();
00598
00602 KInetSocketAddress asInet() const;
00603
00608 KUnixSocketAddress& asUnix();
00609
00613 KUnixSocketAddress asUnix() const;
00614
00615 protected:
00618 KSocketAddressData *d;
00619
00622 KSocketAddress(KSocketAddressData* d);
00623
00624 public:
00632 static int ianaFamily(int af);
00633
00638 static int fromIanaFamily(int iana);
00639 };
00640
00641
00651 class KDECORE_EXPORT KInetSocketAddress: public KSocketAddress
00652 {
00653 friend class KSocketAddress;
00654 public:
00658 KInetSocketAddress();
00659
00669 KInetSocketAddress(const sockaddr* sa, Q_UINT16 len);
00670
00677 KInetSocketAddress(const KIpAddress& host, Q_UINT16 port);
00678
00686 KInetSocketAddress(const KInetSocketAddress& other);
00687
00696 KInetSocketAddress(const KSocketAddress& other);
00697
00701 virtual ~KInetSocketAddress();
00702
00710 KInetSocketAddress& operator =(const KInetSocketAddress& other);
00711
00715 inline operator const sockaddr_in*() const
00716 { return (const sockaddr_in*)address(); }
00717
00721 inline operator const sockaddr_in6*() const
00722 { return (const sockaddr_in6*)address(); }
00723
00729 int ipVersion() const;
00730
00734 KIpAddress ipAddress() const;
00735
00745 KInetSocketAddress& setHost(const KIpAddress& addr);
00746
00753 Q_UINT16 port() const;
00754
00762 KInetSocketAddress& setPort(Q_UINT16 port);
00763
00773 KInetSocketAddress& makeIPv4();
00774
00783 KInetSocketAddress& makeIPv6();
00784
00790 Q_UINT32 flowinfo() const;
00791
00799 KInetSocketAddress& setFlowinfo(Q_UINT32 flowinfo);
00800
00806 int scopeId() const;
00807
00815 KInetSocketAddress& setScopeId(int scopeid);
00816
00817 protected:
00820 KInetSocketAddress(KSocketAddressData* d);
00821
00822 private:
00823 void update();
00824 };
00825
00826
00827
00828
00829
00840 class KDECORE_EXPORT KUnixSocketAddress: public KSocketAddress
00841 {
00842 friend class KSocketAddress;
00843 public:
00847 KUnixSocketAddress();
00848
00857 KUnixSocketAddress(const sockaddr* sa, Q_UINT16 len);
00858
00865 KUnixSocketAddress(const KUnixSocketAddress& other);
00866
00870 KUnixSocketAddress(const QString& pathname);
00871
00875 virtual ~KUnixSocketAddress();
00876
00883 KUnixSocketAddress& operator =(const KUnixSocketAddress& other);
00884
00888 inline operator const sockaddr_un*() const
00889 { return (const sockaddr_un*)address(); }
00890
00895 QString pathname() const;
00896
00902 KUnixSocketAddress& setPathname(const QString& path);
00903
00904 protected:
00907 KUnixSocketAddress(KSocketAddressData* d);
00908 };
00909
00910 }
00911
00912 #endif
|