ksocketaddress.cpp
来自「konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版」· C++ 代码 · 共 952 行 · 第 1/2 页
CPP
952 行
{ d->dup((sockaddr*)0L, len, false); return *this;}int KSocketAddress::family() const{ if (d->invalid()) return AF_UNSPEC; return d->addr.generic->sa_family;}KSocketAddress& KSocketAddress::setFamily(int family){ if (d->invalid()) d->dup((sockaddr*)0L, MIN_SOCKADDR_LEN); d->addr.generic->sa_family = family; return *this;}bool KSocketAddress::operator ==(const KSocketAddress& other) const{ // if this is invalid, it's only equal if the other one is invalid as well if (d->invalid()) return other.d->invalid(); // check the family to make sure we don't do unnecessary comparison if (d->addr.generic->sa_family != other.d->addr.generic->sa_family) return false; // not the same family, not equal // same family then // check the ones we know already switch (d->addr.generic->sa_family) { case AF_INET: Q_ASSERT(d->reallen == SOCKADDR_IN_LEN); Q_ASSERT(other.d->reallen == SOCKADDR_IN_LEN); return memcmp(d->addr.in, other.d->addr.in, SOCKADDR_IN_LEN) == 0;#ifdef AF_INET6 case AF_INET6: Q_ASSERT(d->reallen >= MIN_SOCKADDR_IN6_LEN); Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_IN6_LEN);# if !defined(HAVE_STRUCT_SOCKADDR_IN6) || defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID) // check for the case where sin6_scope_id isn't present if (d->reallen != other.d->reallen) { if (memcmp(d->addr.in6, other.d->addr.in6, MIN_SOCKADDR_IN6_LEN) != 0) return false; // not equal if (d->reallen > other.d->reallen) return d->addr.in6->sin6_scope_id == 0; else return other.d->addr.in6->sin6_scope_id == 0; }# endif return memcmp(d->addr.in6, other.d->addr.in6, d->reallen) == 0;#endif case AF_UNIX: Q_ASSERT(d->reallen >= MIN_SOCKADDR_UN_LEN); Q_ASSERT(other.d->reallen >= MIN_SOCKADDR_UN_LEN); // do a string comparison here return strcmp(d->addr.un->sun_path, other.d->addr.un->sun_path) == 0; default: // something else we don't know about // they are equal if and only if they are exactly equal if (d->reallen == other.d->reallen) return memcmp(d->addr.generic, other.d->addr.generic, d->reallen) == 0; } return false; // not equal in any other case}QString KSocketAddress::nodeName() const{ if (d->invalid()) return QString::null; switch (d->addr.generic->sa_family) { case AF_INET:#ifdef AF_INET6 case AF_INET6: QString scopeid("%"); if (d->addr.generic->sa_family == AF_INET6 && d->addr.in6->sin6_scope_id) scopeid += QString::number(d->addr.in6->sin6_scope_id); else scopeid.truncate(0); return d->ref.ipAddress().toString() + scopeid;#else return d->ref.ipAddress().toString();#endif } // any other case, including AF_UNIX return QString::null;}QString KSocketAddress::serviceName() const{ if (d->invalid()) return QString::null; switch (d->addr.generic->sa_family) { case AF_INET:#ifdef AF_INET6 case AF_INET6:#endif return QString::number(d->ref.port()); case AF_UNIX: return d->ref.pathname(); } return QString::null;}QString KSocketAddress::toString() const{ if (d->invalid()) return QString::null; QString fmt; if (d->addr.generic->sa_family == AF_INET) fmt = "%1:%2";#ifdef AF_INET6 else if (d->addr.generic->sa_family == AF_INET6) fmt = "[%1]:%2";#endif else if (d->addr.generic->sa_family == AF_UNIX) return QString::fromLatin1("unix:%1").arg(serviceName()); else return i18n("1: the unknown socket address family number", "Unknown family %1").arg(d->addr.generic->sa_family); return fmt.arg(nodeName()).arg(serviceName());}KInetSocketAddress& KSocketAddress::asInet(){ return d->ref;}KInetSocketAddress KSocketAddress::asInet() const{ return d->ref;}KUnixSocketAddress& KSocketAddress::asUnix(){ return d->ref;}KUnixSocketAddress KSocketAddress::asUnix() const{ return d->ref;}int KSocketAddress::ianaFamily(int af){ switch (af) { case AF_INET: return 1;#ifdef AF_INET6 case AF_INET6: return 2;#endif default: return 0; }}int KSocketAddress::fromIanaFamily(int iana){ switch (iana) { case 1: return AF_INET;#ifdef AF_INET6 case 2: return AF_INET6;#endif default: return AF_UNSPEC; }}// default constructorKInetSocketAddress::KInetSocketAddress(){}// binary data constructorKInetSocketAddress::KInetSocketAddress(const sockaddr* sa, Q_UINT16 len) : KSocketAddress(sa, len){ if (!d->invalid()) update();}// create from IP and portKInetSocketAddress::KInetSocketAddress(const KIpAddress& host, Q_UINT16 port){ setHost(host); setPort(port);}// copy constructorKInetSocketAddress::KInetSocketAddress(const KInetSocketAddress& other) : KSocketAddress(other){}// special copy constructorKInetSocketAddress::KInetSocketAddress(const KSocketAddress& other) : KSocketAddress(other){ if (!d->invalid()) update();}// special constructorKInetSocketAddress::KInetSocketAddress(KSocketAddressData *d) : KSocketAddress(d){}// destructorKInetSocketAddress::~KInetSocketAddress(){ /* nothing to do */}// copy operatorKInetSocketAddress& KInetSocketAddress::operator =(const KInetSocketAddress& other){ KSocketAddress::operator =(other); return *this;}// IP versionint KInetSocketAddress::ipVersion() const{ if (d->invalid()) return 0; switch (d->addr.generic->sa_family) { case AF_INET: return 4;#ifdef AF_INET6 case AF_INET6: return 6;#endif } return 0; // for all other cases}KIpAddress KInetSocketAddress::ipAddress() const{ if (d->invalid()) return KIpAddress(); // return an empty address as well switch (d->addr.generic->sa_family) { case AF_INET: return KIpAddress(&d->addr.in->sin_addr, 4);#ifdef AF_INET6 case AF_INET6: return KIpAddress(&d->addr.in6->sin6_addr, 6);#endif } return KIpAddress(); // empty in all other cases}KInetSocketAddress& KInetSocketAddress::setHost(const KIpAddress& ip){ switch (ip.version()) { case 4: makeIPv4(); memcpy(&d->addr.in->sin_addr, ip.addr(), sizeof(d->addr.in->sin_addr)); break; case 6: makeIPv6(); memcpy(&d->addr.in6->sin6_addr, ip.addr(), sizeof(d->addr.in6->sin6_addr)); break; default: // empty d->invalidate(); } return *this;}// returns the portQ_UINT16 KInetSocketAddress::port() const{ if (d->invalid()) return 0; switch (d->addr.generic->sa_family) { case AF_INET: return ntohs(d->addr.in->sin_port);#ifdef AF_INET6 case AF_INET6: return ntohs(d->addr.in6->sin6_port);#endif } return 0;}KInetSocketAddress& KInetSocketAddress::setPort(Q_UINT16 port){ if (d->invalid()) makeIPv4(); switch (d->addr.generic->sa_family) { case AF_INET: d->addr.in->sin_port = htons(port); break; #ifdef AF_INET6 case AF_INET6: d->addr.in6->sin6_port = htons(port); break;#endif default: d->invalidate(); // setting the port on something else } return *this;}KInetSocketAddress& KInetSocketAddress::makeIPv4(){ d->makeipv4(); return *this;}KInetSocketAddress& KInetSocketAddress::makeIPv6(){ d->makeipv6(); return *this;}Q_UINT32 KInetSocketAddress::flowinfo() const{#ifndef AF_INET6 return 0;#else if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6) return d->addr.in6->sin6_flowinfo; return 0;#endif}KInetSocketAddress& KInetSocketAddress::setFlowinfo(Q_UINT32 flowinfo){ makeIPv6(); // must set here d->addr.in6->sin6_flowinfo = flowinfo; return *this;}int KInetSocketAddress::scopeId() const{#ifndef AF_INET6 return 0;#else if (!d->invalid() && d->addr.in6->sin6_family == AF_INET6) return d->addr.in6->sin6_scope_id; return 0;#endif}KInetSocketAddress& KInetSocketAddress::setScopeId(int scopeid){ makeIPv6(); // must set here d->addr.in6->sin6_scope_id = scopeid; return *this;}void KInetSocketAddress::update(){ if (d->addr.generic->sa_family == AF_INET) return;#ifdef AF_INET6 else if (d->addr.generic->sa_family == AF_INET6) return;#endif else d->invalidate();}KUnixSocketAddress::KUnixSocketAddress(){}KUnixSocketAddress::KUnixSocketAddress(const sockaddr* sa, Q_UINT16 len) : KSocketAddress(sa, len){ if (!d->invalid() && d->addr.un->sun_family != AF_UNIX) d->invalidate();}KUnixSocketAddress::KUnixSocketAddress(const KUnixSocketAddress& other) : KSocketAddress(other){}KUnixSocketAddress::KUnixSocketAddress(const QString& pathname){ setPathname(pathname);}KUnixSocketAddress::KUnixSocketAddress(KSocketAddressData* d) : KSocketAddress(d){}KUnixSocketAddress::~KUnixSocketAddress(){}KUnixSocketAddress& KUnixSocketAddress::operator =(const KUnixSocketAddress& other){ KSocketAddress::operator =(other); return *this;}QString KUnixSocketAddress::pathname() const{ if (!d->invalid() && d->addr.un->sun_family == AF_UNIX) return QFile::decodeName(d->addr.un->sun_path); return QString::null;}KUnixSocketAddress& KUnixSocketAddress::setPathname(const QString& path){ d->dup(0L, MIN_SOCKADDR_UN_LEN + path.length()); d->addr.un->sun_family = AF_UNIX; strcpy(d->addr.un->sun_path, QFile::encodeName(path));#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN d->addr.un->sun_len = d->reallen;#endif return *this;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?