kdecore Library API Documentation

ksocketaddress.h

00001 /* -*- C++ -*- 00002 * Copyright (C) 2003 Thiago Macieira <thiago.macieira@kdemail.net> 00003 * 00004 * 00005 * Permission is hereby granted, free of charge, to any person obtaining 00006 * a copy of this software and associated documentation files (the 00007 * "Software"), to deal in the Software without restriction, including 00008 * without limitation the rights to use, copy, modify, merge, publish, 00009 * distribute, sublicense, and/or sell copies of the Software, and to 00010 * permit persons to whom the Software is furnished to do so, subject to 00011 * the following conditions: 00012 * 00013 * The above copyright notice and this permission notice shall be included 00014 * in all copies or substantial portions of the Software. 00015 * 00016 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00017 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00018 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00019 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00020 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00021 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00022 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 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 /*-- tests --*/ 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]; // 16 bytes, needed for an IPv6 address 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: // static 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 * External definition 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 } // namespace KNetwork 00901 00902 #endif
KDE Logo
This file is part of the documentation for kdecore Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Apr 14 00:03:32 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003