• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KDECore

k3socketaddress.h

Go to the documentation of this file.
00001 //krazy:excludeall=dpointer,inline (lightweight classes; kde3 support)
00002 /*  -*- C++ -*-
00003  *  Copyright (C) 2003,2005 Thiago Macieira <thiago@kde.org>
00004  *
00005  *
00006  *  Permission is hereby granted, free of charge, to any person obtaining
00007  *  a copy of this software and associated documentation files (the
00008  *  "Software"), to deal in the Software without restriction, including
00009  *  without limitation the rights to use, copy, modify, merge, publish,
00010  *  distribute, sublicense, and/or sell copies of the Software, and to
00011  *  permit persons to whom the Software is furnished to do so, subject to
00012  *  the following conditions:
00013  *
00014  *  The above copyright notice and this permission notice shall be included 
00015  *  in all copies or substantial portions of the Software.
00016  *
00017  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00018  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00019  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00020  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00021  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00022  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00023  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00024  */
00025 
00026 #ifndef KSOCKETADDRESS_H
00027 #define KSOCKETADDRESS_H
00028 
00029 #include <kdecore_export.h>
00030 #include <QtCore/QByteArray>
00031 
00032 struct sockaddr;
00033 struct sockaddr_in;
00034 struct sockaddr_in6;
00035 struct sockaddr_un;
00036 
00037 namespace KNetwork {
00038 
00039 class KIpAddress;
00040 class KSocketAddress;
00041 class KInetSocketAddress;
00042 class KUnixSocketAddress;
00043 
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(quint32 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 quint32 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 ((quint8*)addr())[0] == 0xff;
00304     return false;
00305   }
00306 
00310   inline bool isLinkLocal() const
00311   { 
00312     if (version() != 6) return false;
00313     quint8* addr = (quint8*)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     quint8* addr = (quint8*)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     quint32* addr = (quint32*)this->addr();
00342     return addr[0] == 0 && addr[1] == 0 &&
00343       ((quint16*)&addr[2])[0] == 0 &&
00344       ((quint16*)&addr[2])[1] == 0xffff;
00345   }
00346 
00350   inline bool isV4Compat() const
00351   {
00352     if (version() != 6 || isLocalhost()) return false;
00353     quint32* addr = (quint32*)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() && (((quint32*)addr())[0] & 0xf) == 0x1; }
00362 
00366   inline bool isMulticastLinkLocal() const
00367   { return version() == 6 && isMulticast() && (((quint32*)addr())[0] & 0xf) == 0x2; }
00368       
00372   inline bool isMulticastSiteLocal() const
00373   { return version() == 6 && isMulticast() && (((quint32*)addr())[0] & 0xf) == 0x5; }
00374 
00378   inline bool isMulticastOrgLocal() const
00379   { return version() == 6 && isMulticast() && (((quint32*)addr())[0] & 0xf) == 0x8; }
00380 
00384   inline bool isMulticastGlobal() const
00385   { return version() == 6 && isMulticast() && (((quint32*)addr())[0] & 0xf) == 0xe; }
00386 
00387 protected:
00388   quint32 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;
00414 class KDECORE_EXPORT KSocketAddress //krazy:exclude=dpointer (we got one, just not called Private)
00415 {
00416 public:
00422   KSocketAddress();
00423 
00431   KSocketAddress(const sockaddr* sa, quint16 len);
00432 
00441   KSocketAddress(const KSocketAddress& other);
00442 
00446   virtual ~KSocketAddress();
00447 
00454   KSocketAddress& operator =(const KSocketAddress& other);
00455 
00463   const sockaddr* address() const;
00464 
00475   sockaddr* address();
00476 
00484   KSocketAddress& setAddress(const sockaddr *sa, quint16 len);
00485 
00490   inline operator const sockaddr*() const
00491   { return address(); }
00492 
00496   quint16 length() const;
00497 
00518   KSocketAddress& setLength(quint16 len);
00519 
00524   int family() const;
00525 
00534   virtual KSocketAddress& setFamily(int family);
00535 
00541   inline int ianaFamily() const
00542   { return ianaFamily(family()); }
00543   
00552   bool operator ==(const KSocketAddress& other) const;
00553 
00563   virtual QString nodeName() const;
00564 
00574   virtual QString serviceName() const;
00575 
00582   virtual QString toString() const;
00583 
00588   KInetSocketAddress& asInet();
00589 
00593   KInetSocketAddress asInet() const;
00594 
00599   KUnixSocketAddress& asUnix();
00600 
00604   KUnixSocketAddress asUnix() const;
00605 
00606 protected:
00609   KSocketAddressData *d;
00610 
00613   KSocketAddress(KSocketAddressData* d);
00614 
00615 public:             // static
00623   static int ianaFamily(int af);
00624 
00629   static int fromIanaFamily(int iana);
00630 };
00631 
00632 
00643 class KDECORE_EXPORT KInetSocketAddress: public KSocketAddress
00644 {
00645   friend class KSocketAddress;
00646 public:
00650   KInetSocketAddress();
00651 
00661   KInetSocketAddress(const sockaddr* sa, quint16 len);
00662 
00669   KInetSocketAddress(const KIpAddress& host, quint16 port);
00670 
00678   KInetSocketAddress(const KInetSocketAddress& other);
00679 
00688   KInetSocketAddress(const KSocketAddress& other);
00689 
00693   virtual ~KInetSocketAddress();
00694 
00702   KInetSocketAddress& operator =(const KInetSocketAddress& other);
00703 
00707   inline operator const sockaddr_in*() const
00708   { return (const sockaddr_in*)address(); }
00709 
00713   inline operator const sockaddr_in6*() const
00714   { return (const sockaddr_in6*)address(); }
00715 
00721   int ipVersion() const;
00722 
00726   KIpAddress ipAddress() const;
00727 
00737   KInetSocketAddress& setHost(const KIpAddress& addr);
00738 
00745   quint16 port() const;
00746 
00754   KInetSocketAddress& setPort(quint16 port);
00755 
00765   KInetSocketAddress& makeIPv4();
00766 
00775   KInetSocketAddress& makeIPv6();
00776 
00782   quint32 flowinfo() const;
00783 
00791   KInetSocketAddress& setFlowinfo(quint32 flowinfo);
00792 
00798   int scopeId() const;
00799 
00807   KInetSocketAddress& setScopeId(int scopeid);
00808 
00809 protected:
00812   KInetSocketAddress(KSocketAddressData* d);
00813 
00814 private:
00815   void update();
00816 };
00817 
00818 /*
00819  * External definition
00820  */
00821 
00833 class KDECORE_EXPORT KUnixSocketAddress: public KSocketAddress
00834 {
00835   friend class KSocketAddress;
00836 public:
00840   KUnixSocketAddress();
00841 
00850   KUnixSocketAddress(const sockaddr* sa, quint16 len);
00851 
00858   KUnixSocketAddress(const KUnixSocketAddress& other);
00859 
00863   KUnixSocketAddress(const QString& pathname);
00864 
00868   virtual ~KUnixSocketAddress();
00869 
00876   KUnixSocketAddress& operator =(const KUnixSocketAddress& other);
00877 
00881   inline operator const sockaddr_un*() const
00882   { return (const sockaddr_un*)address(); }
00883 
00888   QString pathname() const;
00889 
00895   KUnixSocketAddress& setPathname(const QString& path);
00896 
00897 protected:
00900   KUnixSocketAddress(KSocketAddressData* d);
00901 };
00902 
00903 }               // namespace KNetwork
00904 
00905 #endif

KDECore

Skip menu "KDECore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal