Changeset View
Changeset View
Standalone View
Standalone View
src/netaddress.cpp
Show First 20 Lines • Show All 474 Lines • ▼ Show 20 Lines | CService::CService(const struct sockaddr_in6 &addr) | ||||
: CNetAddr(addr.sin6_addr, addr.sin6_scope_id), | : CNetAddr(addr.sin6_addr, addr.sin6_scope_id), | ||||
port(ntohs(addr.sin6_port)) { | port(ntohs(addr.sin6_port)) { | ||||
assert(addr.sin6_family == AF_INET6); | assert(addr.sin6_family == AF_INET6); | ||||
} | } | ||||
bool CService::SetSockAddr(const struct sockaddr *paddr) { | bool CService::SetSockAddr(const struct sockaddr *paddr) { | ||||
switch (paddr->sa_family) { | switch (paddr->sa_family) { | ||||
case AF_INET: | case AF_INET: | ||||
*this = CService(*(const struct sockaddr_in *)paddr); | *this = | ||||
CService(*reinterpret_cast<const struct sockaddr_in *>(paddr)); | |||||
return true; | return true; | ||||
case AF_INET6: | case AF_INET6: | ||||
*this = CService(*(const struct sockaddr_in6 *)paddr); | *this = | ||||
CService(*reinterpret_cast<const struct sockaddr_in6 *>(paddr)); | |||||
return true; | return true; | ||||
default: | default: | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
unsigned short CService::GetPort() const { | unsigned short CService::GetPort() const { | ||||
return port; | return port; | ||||
} | } | ||||
bool operator==(const CService &a, const CService &b) { | bool operator==(const CService &a, const CService &b) { | ||||
return (CNetAddr)a == (CNetAddr)b && a.port == b.port; | return (CNetAddr)a == (CNetAddr)b && a.port == b.port; | ||||
} | } | ||||
bool operator<(const CService &a, const CService &b) { | bool operator<(const CService &a, const CService &b) { | ||||
return static_cast<CNetAddr>(a) < static_cast<CNetAddr>(b) || | return static_cast<CNetAddr>(a) < static_cast<CNetAddr>(b) || | ||||
(static_cast<CNetAddr>(a) == static_cast<CNetAddr>(b) && | (static_cast<CNetAddr>(a) == static_cast<CNetAddr>(b) && | ||||
a.port < b.port); | a.port < b.port); | ||||
} | } | ||||
bool CService::GetSockAddr(struct sockaddr *paddr, socklen_t *addrlen) const { | bool CService::GetSockAddr(struct sockaddr *paddr, socklen_t *addrlen) const { | ||||
if (IsIPv4()) { | if (IsIPv4()) { | ||||
if (*addrlen < (socklen_t)sizeof(struct sockaddr_in)) return false; | if (*addrlen < (socklen_t)sizeof(struct sockaddr_in)) return false; | ||||
*addrlen = sizeof(struct sockaddr_in); | *addrlen = sizeof(struct sockaddr_in); | ||||
struct sockaddr_in *paddrin = (struct sockaddr_in *)paddr; | struct sockaddr_in *paddrin = | ||||
reinterpret_cast<struct sockaddr_in *>(paddr); | |||||
memset(paddrin, 0, *addrlen); | memset(paddrin, 0, *addrlen); | ||||
if (!GetInAddr(&paddrin->sin_addr)) return false; | if (!GetInAddr(&paddrin->sin_addr)) return false; | ||||
paddrin->sin_family = AF_INET; | paddrin->sin_family = AF_INET; | ||||
paddrin->sin_port = htons(port); | paddrin->sin_port = htons(port); | ||||
return true; | return true; | ||||
} | } | ||||
if (IsIPv6()) { | if (IsIPv6()) { | ||||
if (*addrlen < (socklen_t)sizeof(struct sockaddr_in6)) return false; | if (*addrlen < (socklen_t)sizeof(struct sockaddr_in6)) return false; | ||||
*addrlen = sizeof(struct sockaddr_in6); | *addrlen = sizeof(struct sockaddr_in6); | ||||
struct sockaddr_in6 *paddrin6 = (struct sockaddr_in6 *)paddr; | struct sockaddr_in6 *paddrin6 = | ||||
reinterpret_cast<struct sockaddr_in6 *>(paddr); | |||||
memset(paddrin6, 0, *addrlen); | memset(paddrin6, 0, *addrlen); | ||||
if (!GetIn6Addr(&paddrin6->sin6_addr)) return false; | if (!GetIn6Addr(&paddrin6->sin6_addr)) return false; | ||||
paddrin6->sin6_scope_id = scopeId; | paddrin6->sin6_scope_id = scopeId; | ||||
paddrin6->sin6_family = AF_INET6; | paddrin6->sin6_family = AF_INET6; | ||||
paddrin6->sin6_port = htons(port); | paddrin6->sin6_port = htons(port); | ||||
return true; | return true; | ||||
} | } | ||||
return false; | return false; | ||||
▲ Show 20 Lines • Show All 164 Lines • Show Last 20 Lines |