ksockaddr.cpp
来自「konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版」· C++ 代码 · 共 895 行 · 第 1/2 页
CPP
895 行
#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_STRUCT_SOCKADDR_IN6_SIN6_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::nodeName() called on uninitialized class\n"; return i18n("<empty>"); } return QString::fromLatin1(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_STRUCT_SOCKADDR_IN6_SIN6_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}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; // Clear flowinfo and scopeid d->sin6.sin6_flowinfo = 0;# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID d->sin6.sin6_scope_id = 0;# endif#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( d->sin6 );#endif}QString KInetSocketAddress::addrToString(int family, const void* addr){ char buf[INET6_ADDRSTRLEN+1]; return QString::fromLatin1(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 KUnixSocketAddressPrivate{public: sockaddr_un *m_sun; KUnixSocketAddressPrivate() : m_sun(NULL) { }};KUnixSocketAddress::KUnixSocketAddress() : d(new KUnixSocketAddressPrivate){}KUnixSocketAddress::KUnixSocketAddress(const sockaddr_un* _sun, ksocklen_t size) : d(new KUnixSocketAddressPrivate){ setAddress(_sun, size);}KUnixSocketAddress::KUnixSocketAddress(QCString pathname) : d(new KUnixSocketAddressPrivate){ 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_STRUCT_SOCKADDR_SA_LEN data->sa_len = _size;#endif return 1;}bool KUnixSocketAddress::setAddress(QCString path){ // the +1 is necessary for the ending zero ksocklen_t newsize = offsetof(sockaddr_un, sun_path) + path.length() + 1; if (owndata && (d->m_sun != NULL) && (datasize >= newsize)) { // we can reuse this strcpy(d->m_sun->sun_path, path);#ifdef HAVE_STRUCT_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_STRUCT_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() < MIN_SOCKADDR_LEN) || (s2.size() < MIN_SOCKADDR_LEN)) return false; struct sockaddr_un *sun1 = (sockaddr_un *) s1.address(); struct sockaddr_un *sun2 = (sockaddr_un *) s2.address(); if (s1.size() == MIN_SOCKADDR_LEN && s2.size() == MIN_SOCKADDR_LEN) return true; // unnamed Unix sockets return (strcmp(sun1->sun_path, sun2->sun_path) == 0);}void KSocketAddress::virtual_hook( int, void* ){ /*BASE::virtual_hook( id, data );*/ }void KInetSocketAddress::virtual_hook( int id, void* data ){ KSocketAddress::virtual_hook( id, data ); }void KUnixSocketAddress::virtual_hook( int id, void* data ){ KSocketAddress::virtual_hook( id, data ); }#include "ksockaddr.moc"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?