📄 ksockaddr.cpp
字号:
}#ifdef AF_INET6 else { inet_pton(family, addr.latin1(), (void*)&(d->sin6.sin6_addr)); fromV6(); }#endif d->sockfamily = family; return true;}bool KInetSocketAddress::setPort(unsigned short port){ // set port on all socket types d->sin.sin_port = htons(port);#ifdef AF_INET6 d->sin6.sin6_port = htons(port);#endif return true;}bool KInetSocketAddress::setFamily(int _family){ if (_family != AF_INET #ifdef AF_INET6 && _family != AF_INET6#endif ) { kdWarning() << "KInetSocketAddress::setFamily(int) called with unknown family\n"; return false; } d->sockfamily = _family; if (_family == AF_INET) fromV4();#ifdef AF_INET6 else if (_family == AF_INET6) fromV6();#endif return true;}bool KInetSocketAddress::setFlowinfo(Q_UINT32 flowinfo){#ifdef AF_INET6 if (d->sockfamily == AF_INET6) { d->sin6.sin6_flowinfo = flowinfo; return true; }#endif return false;}bool KInetSocketAddress::setScopeId(int scopeid){#if defined(AF_INET6) && defined(HAVE_SOCKADDR_IN6_SCOPE_ID) if (d->sockfamily == AF_INET6) { d->sin6.sin6_scope_id = scopeid; return true; }#endif (void)scopeid; return false;}const sockaddr_in* KInetSocketAddress::addressV4() const{ if (d->sockfamily == AF_INET) return &d->sin;#ifdef AF_INET6 else if (d->sockfamily == AF_INET6) { // check if this IPv6 address was converted without loss if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr)) return &d->sin; else return NULL; // there was loss, so return nothing }#endif kdWarning() << "KInetSocketAddress::addressV4() called on uninitialized socket\n"; return NULL;}const sockaddr_in6* KInetSocketAddress::addressV6() const{#ifdef AF_INET6 return &d->sin6;#else return NULL;#endif}in_addr KInetSocketAddress::hostV4() const{ // this might be empty return d->sin.sin_addr;}/* * ATTENTION * This function is left undefined if no IPv6 support exists * This is intentional */#ifdef AF_INET6in6_addr KInetSocketAddress::hostV6() const{ return d->sin6.sin6_addr;}#endifQString KInetSocketAddress::pretty() const{ if (d->sockfamily != AF_INET #ifdef AF_INET6 && d->sockfamily != AF_INET6#endif ) { kdWarning() << "KInetSocketAddress::pretty() called on uninitialized class\n"; return i18n("<empty>"); } return i18n("1: hostname, 2: port number", "%1 port %2").arg(nodeName()).arg(serviceName());}QString KInetSocketAddress::nodeName() const{ char buf[INET6_ADDRSTRLEN]; // INET6_ADDRSTRLEN > INET_ADDRSTRLEN if (d->sockfamily == AF_INET) inet_ntop(d->sockfamily, (void*)&d->sin.sin_addr, buf, sizeof(buf));#ifdef AF_INET6 else if (d->sockfamily == AF_INET6) inet_ntop(d->sockfamily, (void*)&d->sin6.sin6_addr, buf, sizeof(buf));#endif else { kdWarning() << "KInetSocketAddress::prettyHost() called on uninitialized class\n"; return i18n("<empty>"); } return QString::fromLocal8Bit(buf); // FIXME! What's the encoding?}QString KInetSocketAddress::serviceName() const{ return QString::number(port());}unsigned short KInetSocketAddress::port() const{#ifdef AF_INET6 // we prefer sin6 here because fromV6() might make sin.sin_port be 0 return ntohs(d->sin6.sin6_port);#else return ntohs(d->sin.sin_port);#endif}Q_UINT32 KInetSocketAddress::flowinfo() const{#ifdef AF_INET6 if (d->sockfamily == AF_INET6) return (Q_UINT32)d->sin6.sin6_flowinfo;#endif return 0;}ksocklen_t KInetSocketAddress::size() const{ if (d->sockfamily == AF_INET) return sizeof(d->sin);#ifdef AF_INET6 else if (d->sockfamily == AF_INET6) return sizeof(d->sin6);#endif else return 0;}bool KInetSocketAddress::areEqualInet(const KSocketAddress &s1, const KSocketAddress &s2, bool coreOnly){ if (s1.family() != s2.family()) return false; if ((s1.size() < sizeof(sockaddr_in)) || (s2.size() < sizeof(sockaddr_in))) return false; struct sockaddr_in *sin1 = (sockaddr_in *) s1.address(); struct sockaddr_in *sin2 = (sockaddr_in *) s2.address(); if (coreOnly) return (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr)) == 0); else return (sin1->sin_port == sin2->sin_port) && (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr)) == 0);}bool KInetSocketAddress::areEqualInet6(const KSocketAddress &s1, const KSocketAddress &s2, bool coreOnly){#ifdef AF_INET6 if (s1.family() != s2.family()) return false; if ((s1.size() < sizeof(sockaddr_in6)) || (s2.size() < sizeof(sockaddr_in6))) return false; struct sockaddr_in6 *sin1 = (sockaddr_in6 *) s1.address(); struct sockaddr_in6 *sin2 = (sockaddr_in6 *) s2.address(); if (coreOnly) return (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr)) == 0); else return (sin1->sin6_port == sin2->sin6_port) && (sin1->sin6_flowinfo == sin2->sin6_flowinfo) && #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID (sin1->sin6_scope_id == sin2->sin6_scope_id) && #endif (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr)) == 0);#else return false;#endif}// KDE 3.0: Remove me!bool KInetSocketAddress::isCoreEqual(const KSocketAddress& other) const{ return KSocketAddress::isCoreEqual(other);}void KInetSocketAddress::fromV4(){ // converts an address from v4#ifdef AF_INET6 d->sin6.sin6_port = d->sin.sin_port; // Make this a v4-mapped address ((Q_UINT32*)&d->sin6.sin6_addr)[0] = ((Q_UINT32*)&d->sin6.sin6_addr)[1] = 0; ((Q_UINT32*)&d->sin6.sin6_addr)[2] = htonl(0xffff); ((Q_UINT32*)&d->sin6.sin6_addr)[3] = *(Q_UINT32*)&d->sin.sin_addr;#endif // data == KSocketAddress::data data = (sockaddr*)&d->sin; datasize = sizeof( sockaddr_in );}void KInetSocketAddress::fromV6(){#ifdef AF_INET6 // convert to v4 only if this is a v4-mapped or v4-compat address if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr)) { d->sin.sin_port = d->sin6.sin6_port; *(Q_UINT32*)&d->sin.sin_addr = ((Q_UINT32*)&d->sin6.sin6_addr)[3]; } else { d->sin.sin_port = 0; memset(&d->sin.sin_addr, 0, sizeof(d->sin.sin_addr)); } data = (sockaddr*)&d->sin6; datasize = sizeof( sockaddr_in6 );#endif}QString KInetSocketAddress::addrToString(int family, const void* addr){ char buf[INET6_ADDRSTRLEN+1]; return QString::fromUtf8(inet_ntop(family, addr, buf, INET6_ADDRSTRLEN));}bool KInetSocketAddress::stringToAddr(int family, const char *text, void *dest){ return inet_pton(family, text, dest) != 0;}/** * class KUnixSocketAddress */class KUnixSocketAddress::Private{public: sockaddr_un *m_sun; Private() : m_sun(NULL) { }};KUnixSocketAddress::KUnixSocketAddress() : d(new Private){}KUnixSocketAddress::KUnixSocketAddress(const sockaddr_un* _sun, ksocklen_t size) : d(new Private){ setAddress(_sun, size);}KUnixSocketAddress::KUnixSocketAddress(QCString pathname) : d(new Private){ setAddress(pathname); }KUnixSocketAddress::~KUnixSocketAddress(){ delete d;}bool KUnixSocketAddress::setAddress(const sockaddr_un* _sun, ksocklen_t _size){ if (_sun->sun_family != AF_UNIX) { kdWarning() << "KUnixSocketAddress::setAddress called with invalid socket\n"; return false; } if (owndata && (d->m_sun != NULL) && (datasize >= _size)) { // reuse this without reallocating memcpy(d->m_sun, _sun, _size); } else { if (owndata && (d->m_sun != NULL)) free(d->m_sun); d->m_sun = (sockaddr_un*)malloc(_size); if (d->m_sun == NULL) { // problems owndata = false; return false; } memcpy(d->m_sun, _sun, _size); } datasize = _size; data = (sockaddr*)d->m_sun; owndata = true;#ifdef HAVE_SOCKADDR_SA_LEN data->sa_len = _size;#endif return 1;}bool KUnixSocketAddress::setAddress(QCString path){ ksocklen_t newsize = offsetof(sockaddr_un, sun_path) + path.length(); if (owndata && (d->m_sun != NULL) && (datasize >= newsize)) { // we can reuse this strcpy(d->m_sun->sun_path, path);#ifdef HAVE_SOCKADDR_SA_LEN data->sa_len = newsize;#endif return true; } // nah, we have to do better if (owndata && (d->m_sun != NULL)) free(d->m_sun); d->m_sun = (sockaddr_un*) malloc(newsize); if (d->m_sun == NULL) { owndata = false; return false; } d->m_sun->sun_family = AF_UNIX; strcpy(d->m_sun->sun_path, path); data = (sockaddr*)d->m_sun; datasize = newsize;#ifdef HAVE_SOCKADDR_SA_LEN data->sa_len = newsize;#endif return 1;}QCString KUnixSocketAddress::pathname() const{ if (d->m_sun != NULL) { if (datasize > offsetof(sockaddr_un, sun_path)) return d->m_sun->sun_path; return ""; } return QCString(0);}QString KUnixSocketAddress::pretty() const{ QCString pname = pathname(); if (pname.isEmpty()) return i18n("<empty Unix socket>"); return QFile::decodeName(pathname());}QString KUnixSocketAddress::serviceName() const{ return QString::fromUtf8(pathname());}const sockaddr_un* KUnixSocketAddress::address() const{ return d->m_sun;}bool KUnixSocketAddress::areEqualUnix(const KSocketAddress &s1, const KSocketAddress &s2, bool /* coreOnly */){ if (s1.family() != s2.family()) return false; if ((s1.size() < sizeof(sockaddr_un)) || (s2.size() < sizeof(sockaddr_un))) return false; struct sockaddr_un *sun1 = (sockaddr_un *) s1.address(); struct sockaddr_un *sun2 = (sockaddr_un *) s2.address(); return (strcmp(sun1->sun_path, sun2->sun_path) == 0);}#include "ksockaddr.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -