ksocketaddress.h
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 #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
00236 inline Q_UINT32 IPv4Addr(bool convertMapped = true) const
00237 {
00238 return (convertMapped && isV4Mapped()) ? m_data[3] : m_data[0];
00239 }
00240
00241
00242
00246 inline bool isUnspecified() const
00247 { return version() == 0 ? true : (*this == anyhostV4 || *this == anyhostV6); }
00248
00252 inline bool isLocalhost() const
00253 { return version() == 0 ? false : (*this == localhostV4 || *this == localhostV6); }
00254
00258 inline bool isLoopback() const
00259 { return isLocalhost(); }
00260
00267 inline bool isClassA() const
00268 { return version() != 4 ? false : (IPv4Addr() & 0x80000000) == 0; }
00269
00276 inline bool isClassB() const
00277 { return version() != 4 ? false : (IPv4Addr() & 0xc0000000) == 0x80000000; }
00278
00285 inline bool isClassC() const
00286 { return version() != 4 ? false : (IPv4Addr() & 0xe0000000) == 0xc0000000; }
00287
00294 inline bool isClassD() const
00295 { return version() != 4 ? false : (IPv4Addr() & 0xf0000000) == 0xe0000000; }
00296
00300 inline bool isMulticast() const
00301 {
00302 if (version() == 4) return isClassD();
00303 if (version() == 6) return ((Q_UINT8*)addr())[0] == 0xff;
00304 return false;
00305 }
00306
00310 inline bool isLinkLocal() const
00311 {
00312 if (version() != 6) return false;
00313 Q_UINT8* addr = (Q_UINT8*)this->addr();
00314 return (addr[0] & 0xff) == 0xfe &&
00315 (addr[1] & 0xc0) == 0x80;
00316 }
00317
00321 inline bool isSiteLocal() const
00322 {
00323 if (version() != 6) return false;
00324 Q_UINT8* addr = (Q_UINT8*)this->addr();
00325 return (addr[0] & 0xff) == 0xfe &&
00326 (addr[1] & 0xc0) == 0xc0;
00327 }
00328
00332 inline bool isGlobal() const
00333 { return version() != 6 ? false : !(isMulticast() || isLinkLocal() || isSiteLocal()); }
00334
00338 inline bool isV4Mapped() const
00339 {
00340 if (version() != 6) return false;
00341 Q_UINT32* addr = (Q_UINT32*)this->addr();
00342 return addr[0] == 0 && addr[1] == 0 &&
00343 ((Q_UINT16*)&addr[2])[0] == 0 &&
00344 ((Q_UINT16*)&addr[2])[1] == 0xffff;
00345 }
00346
00350 inline bool isV4Compat() const
00351 {
00352 if (version() != 6 || isLocalhost()) return false;
00353 Q_UINT32* addr = (Q_UINT32*)this->addr();
00354 return addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] != 0;
00355 }
00356
00360 inline bool isMulticastNodeLocal() const
00361 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x1; }
00362
00366 inline bool isMulticastLinkLocal() const
00367 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x2; }
00368
00372 inline bool isMulticastSiteLocal() const
00373 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x5; }
00374
00378 inline bool isMulticastOrgLocal() const
00379 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0x8; }
00380
00384 inline bool isMulticastGlobal() const
00385 { return version() == 6 && isMulticast() && (((Q_UINT32*)addr())[0] & 0xf) == 0xe; }
00386
00387 protected:
00388 Q_UINT32 m_data[4];
00389
00390 char m_version;
00391
00392 public:
00394 static const KIpAddress localhostV4;
00396 static const KIpAddress anyhostV4;
00397
00399 static const KIpAddress localhostV6;
00401 static const KIpAddress anyhostV6;
00402 };
00403
00404
00405 class KSocketAddressData;
00413 class KDECORE_EXPORT KSocketAddress
00414 {
00415 public:
00421 KSocketAddress();
00422
00430 KSocketAddress(const sockaddr* sa, Q_UINT16 len);
00431
00440 KSocketAddress(const KSocketAddress& other);
00441
00445 virtual ~KSocketAddress();
00446
00453 KSocketAddress& operator =(const KSocketAddress& other);
00454
00462 const sockaddr* address() const;
00463
00474 sockaddr* address();
00475
00483 KSocketAddress& setAddress(const sockaddr *sa, Q_UINT16 len);
00484
00489 inline operator const sockaddr*() const
00490 { return address(); }
00491
00495 Q_UINT16 length() const;
00496
00517 KSocketAddress& setLength(Q_UINT16 len);
00518
00523 int family() const;
00524
00533 virtual KSocketAddress& setFamily(int family);
00534
00540 inline int ianaFamily() const
00541 { return ianaFamily(family()); }
00542
00551 bool operator ==(const KSocketAddress& other) const;
00552
00562 virtual QString nodeName() const;
00563
00573 virtual QString serviceName() const;
00574
00581 virtual QString toString() const;
00582
00587 KInetSocketAddress& asInet();
00588
00592 KInetSocketAddress asInet() const;
00593
00598 KUnixSocketAddress& asUnix();
00599
00603 KUnixSocketAddress asUnix() const;
00604
00605 protected:
00608 KSocketAddressData *d;
00609
00612 KSocketAddress(KSocketAddressData* d);
00613
00614 public:
00622 static int ianaFamily(int af);
00623
00628 static int fromIanaFamily(int iana);
00629 };
00630
00631
00641 class KDECORE_EXPORT KInetSocketAddress: public KSocketAddress
00642 {
00643 friend class KSocketAddress;
00644 public:
00648 KInetSocketAddress();
00649
00659 KInetSocketAddress(const sockaddr* sa, Q_UINT16 len);
00660
00667 KInetSocketAddress(const KIpAddress& host, Q_UINT16 port);
00668
00676 KInetSocketAddress(const KInetSocketAddress& other);
00677
00686 KInetSocketAddress(const KSocketAddress& other);
00687
00691 virtual ~KInetSocketAddress();
00692
00700 KInetSocketAddress& operator =(const KInetSocketAddress& other);
00701
00705 inline operator const sockaddr_in*() const
00706 { return (const sockaddr_in*)address(); }
00707
00711 inline operator const sockaddr_in6*() const
00712 { return (const sockaddr_in6*)address(); }
00713
00719 int ipVersion() const;
00720
00724 KIpAddress ipAddress() const;
00725
00735 KInetSocketAddress& setHost(const KIpAddress& addr);
00736
00743 Q_UINT16 port() const;
00744
00752 KInetSocketAddress& setPort(Q_UINT16 port);
00753
00763 KInetSocketAddress& makeIPv4();
00764
00773 KInetSocketAddress& makeIPv6();
00774
00780 Q_UINT32 flowinfo() const;
00781
00789 KInetSocketAddress& setFlowinfo(Q_UINT32 flowinfo);
00790
00796 int scopeId() const;
00797
00805 KInetSocketAddress& setScopeId(int scopeid);
00806
00807 protected:
00810 KInetSocketAddress(KSocketAddressData* d);
00811
00812 private:
00813 void update();
00814 };
00815
00816
00817
00818
00819
00830 class KDECORE_EXPORT KUnixSocketAddress: public KSocketAddress
00831 {
00832 friend class KSocketAddress;
00833 public:
00837 KUnixSocketAddress();
00838
00847 KUnixSocketAddress(const sockaddr* sa, Q_UINT16 len);
00848
00855 KUnixSocketAddress(const KUnixSocketAddress& other);
00856
00860 KUnixSocketAddress(const QString& pathname);
00861
00865 virtual ~KUnixSocketAddress();
00866
00873 KUnixSocketAddress& operator =(const KUnixSocketAddress& other);
00874
00878 inline operator const sockaddr_un*() const
00879 { return (const sockaddr_un*)address(); }
00880
00885 QString pathname() const;
00886
00892 KUnixSocketAddress& setPathname(const QString& path);
00893
00894 protected:
00897 KUnixSocketAddress(KSocketAddressData* d);
00898 };
00899
00900 }
00901
00902 #endif
This file is part of the documentation for kdecore Library Version 3.4.1.