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.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jul 2 13:02:21 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003