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
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
00061 class KIpAddress
00062 {
00063
public:
00068 inline KIpAddress() : m_version(0)
00069 { }
00070
00079 inline KIpAddress(
const KIpAddress& other)
00080 { *
this = other; }
00081
00089 inline KIpAddress(
const QString& addr)
00090 {
setAddress(addr); }
00091
00099 inline KIpAddress(
const char* addr)
00100 {
setAddress(addr); }
00101
00108 inline KIpAddress(
const void* addr,
int version = 4)
00109 {
setAddress(addr, version); }
00110
00121 inline KIpAddress(Q_UINT32 ip4addr)
00122 {
setAddress(&ip4addr, 4); }
00123
00130 inline ~KIpAddress()
00131 { }
00132
00140
KIpAddress&
operator =(
const KIpAddress& other);
00141
00147 inline bool operator ==(
const KIpAddress& other)
const
00148
{
return compare(other,
true); }
00149
00163
bool compare(
const KIpAddress& other,
bool checkMapped =
true)
const;
00164
00170 inline int version()
const
00171
{
return m_version; }
00172
00176 inline bool isIPv4Addr()
const
00177
{
return version() == 4; }
00178
00182 inline bool isIPv6Addr()
const
00183
{
return version() == 6; }
00184
00191
bool setAddress(
const QString& address);
00192
00199
bool setAddress(
const char* address);
00200
00209
bool setAddress(
const void* raw,
int version = 4);
00210
00214
QString toString() const;
00215
00219 inline const
void *addr()
const
00220
{
return m_data; }
00221
00235 inline Q_UINT32
IPv4Addr(
bool convertMapped =
true)
const
00236
{
00237
return (convertMapped &&
isV4Mapped()) ? m_data[3] : m_data[0];
00238 }
00239
00240
00241
00245 inline bool isUnspecified()
const
00246
{
return version() == 0 ?
true : (*
this ==
anyhostV4 || *
this ==
anyhostV6); }
00247
00251 inline bool isLocalhost()
const
00252
{
return version() == 0 ?
false : (*
this ==
localhostV4 || *
this ==
localhostV6); }
00253
00257 inline bool isLoopback()
const
00258
{
return isLocalhost(); }
00259
00266 inline bool isClassA()
const
00267
{
return version() != 4 ?
false : (
IPv4Addr() & 0x80000000) == 0; }
00268
00275 inline bool isClassB()
const
00276
{
return version() != 4 ?
false : (
IPv4Addr() & 0xc0000000) == 0x80000000; }
00277
00284 inline bool isClassC()
const
00285
{
return version() != 4 ?
false : (
IPv4Addr() & 0xe0000000) == 0xc0000000; }
00286
00293 inline bool isClassD()
const
00294
{
return version() != 4 ?
false : (
IPv4Addr() & 0xf0000000) == 0xe0000000; }
00295
00299 inline bool isMulticast()
const
00300
{
00301
if (
version() == 4)
return isClassD();
00302
if (
version() == 6)
return ((Q_UINT8*)
addr())[0] == 0xff;
00303
return false;
00304 }
00305
00309 inline bool isLinkLocal()
const
00310
{
00311
if (
version() != 6)
return false;
00312 Q_UINT8*
addr = (Q_UINT8*)this->
addr();
00313
return (addr[0] & 0xff) == 0xfe &&
00314 (addr[1] & 0xc0) == 0x80;
00315 }
00316
00320 inline bool isSiteLocal()
const
00321
{
00322
if (
version() != 6)
return false;
00323 Q_UINT8*
addr = (Q_UINT8*)this->
addr();
00324
return (addr[0] & 0xff) == 0xfe &&
00325 (addr[1] & 0xc0) == 0xc0;
00326 }
00327
00331 inline bool isGlobal()
const
00332
{
return version() != 6 ?
false : !(
isMulticast() ||
isLinkLocal() ||
isSiteLocal()); }
00333
00337 inline bool isV4Mapped()
const
00338
{
00339
if (
version() != 6)
return false;
00340 Q_UINT32*
addr = (Q_UINT32*)this->
addr();
00341
return addr[0] == 0 && addr[1] == 0 &&
00342 ((Q_UINT16*)&addr[2])[0] == 0 &&
00343 ((Q_UINT16*)&addr[2])[1] == 0xffff;
00344 }
00345
00349 inline bool isV4Compat()
const
00350
{
00351
if (
version() != 6 ||
isLocalhost())
return false;
00352 Q_UINT32*
addr = (Q_UINT32*)this->
addr();
00353
return addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && addr[3] != 0;
00354 }
00355
00359 inline bool isMulticastNodeLocal()
const
00360
{
return version() == 6 &&
isMulticast() && (((Q_UINT32*)
addr())[0] & 0xf) == 0x1; }
00361
00365 inline bool isMulticastLinkLocal()
const
00366
{
return version() == 6 &&
isMulticast() && (((Q_UINT32*)
addr())[0] & 0xf) == 0x2; }
00367
00371 inline bool isMulticastSiteLocal()
const
00372
{
return version() == 6 &&
isMulticast() && (((Q_UINT32*)
addr())[0] & 0xf) == 0x5; }
00373
00377 inline bool isMulticastOrgLocal()
const
00378
{
return version() == 6 &&
isMulticast() && (((Q_UINT32*)
addr())[0] & 0xf) == 0x8; }
00379
00383 inline bool isMulticastGlobal()
const
00384
{
return version() == 6 &&
isMulticast() && (((Q_UINT32*)
addr())[0] & 0xf) == 0xe; }
00385
00386
protected:
00387 Q_UINT32 m_data[4];
00388
00389
char m_version;
00390
00391
public:
00393
static const KIpAddress localhostV4;
00395
static const KIpAddress anyhostV4;
00396
00398
static const KIpAddress localhostV6;
00400
static const KIpAddress anyhostV6;
00401 };
00402
00403
00404
class KSocketAddressData;
00412 class KSocketAddress
00413 {
00414
public:
00420
KSocketAddress();
00421
00429
KSocketAddress(
const sockaddr* sa, Q_UINT16 len);
00430
00439
KSocketAddress(
const KSocketAddress& other);
00440
00444
virtual ~KSocketAddress();
00445
00452
KSocketAddress&
operator =(
const KSocketAddress& other);
00453
00461
const sockaddr*
address()
const;
00462
00473 sockaddr*
address();
00474
00482
KSocketAddress&
setAddress(
const sockaddr *sa, Q_UINT16 len);
00483
00488 inline operator const sockaddr*()
const
00489
{
return address(); }
00490
00494 Q_UINT16
length() const;
00495
00516
KSocketAddress& setLength(Q_UINT16 len);
00517
00522
int family() const;
00523
00532 virtual
KSocketAddress& setFamily(
int family);
00533
00539 inline
int ianaFamily()
const
00540
{
return ianaFamily(
family()); }
00541
00550
bool operator ==(
const KSocketAddress& other)
const;
00551
00561
virtual QString nodeName() const;
00562
00572 virtual
QString serviceName() const;
00573
00580 virtual
QString toString() const;
00581
00586
KInetSocketAddress& asInet();
00587
00591
KInetSocketAddress asInet() const;
00592
00597
KUnixSocketAddress& asUnix();
00598
00602
KUnixSocketAddress asUnix() const;
00603
00604 protected:
00607 KSocketAddressData *d;
00608
00611
KSocketAddress(KSocketAddressData* d);
00612
00613 public:
00621 static
int ianaFamily(
int af);
00622
00627 static
int fromIanaFamily(
int iana);
00628 };
00629
00630
00640 class
KInetSocketAddress: public
KSocketAddress
00641 {
00642
friend class KSocketAddress;
00643
public:
00647
KInetSocketAddress();
00648
00658
KInetSocketAddress(
const sockaddr* sa, Q_UINT16 len);
00659
00666
KInetSocketAddress(
const KIpAddress& host, Q_UINT16 port);
00667
00675
KInetSocketAddress(
const KInetSocketAddress& other);
00676
00685
KInetSocketAddress(
const KSocketAddress& other);
00686
00690
virtual ~
KInetSocketAddress();
00691
00699
KInetSocketAddress&
operator =(
const KInetSocketAddress& other);
00700
00704 inline operator const sockaddr_in*()
const
00705
{
return (
const sockaddr_in*)
address(); }
00706
00710 inline operator const sockaddr_in6*()
const
00711
{
return (
const sockaddr_in6*)
address(); }
00712
00718
int ipVersion() const;
00719
00723
KIpAddress ipAddress() const;
00724
00734
KInetSocketAddress& setHost(const
KIpAddress& addr);
00735
00742 Q_UINT16 port() const;
00743
00751
KInetSocketAddress& setPort(Q_UINT16 port);
00752
00762
KInetSocketAddress& makeIPv4();
00763
00772
KInetSocketAddress& makeIPv6();
00773
00779 Q_UINT32 flowinfo() const;
00780
00788
KInetSocketAddress& setFlowinfo(Q_UINT32 flowinfo);
00789
00795
int scopeId() const;
00796
00804
KInetSocketAddress& setScopeId(
int scopeid);
00805
00806 protected:
00809
KInetSocketAddress(KSocketAddressData* d);
00810
00811 private:
00812
void update();
00813 };
00814
00815
00816
00817
00818
00829 class
KUnixSocketAddress: public KSocketAddress
00830 {
00831
friend class KSocketAddress;
00832
public:
00836
KUnixSocketAddress();
00837
00846
KUnixSocketAddress(
const sockaddr* sa, Q_UINT16 len);
00847
00854
KUnixSocketAddress(
const KUnixSocketAddress& other);
00855
00859
KUnixSocketAddress(
const QString& pathname);
00860
00864
virtual ~
KUnixSocketAddress();
00865
00872
KUnixSocketAddress&
operator =(
const KUnixSocketAddress& other);
00873
00877 inline operator const sockaddr_un*()
const
00878
{
return (
const sockaddr_un*)
address(); }
00879
00884
QString pathname() const;
00885
00891
KUnixSocketAddress& setPathname(const
QString& path);
00892
00893 protected:
00896
KUnixSocketAddress(KSocketAddressData* d);
00897 };
00898
00899 }
00900
00901 #endif