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