diff options
Diffstat (limited to 'source/Host/common/SocketAddress.cpp')
| -rw-r--r-- | source/Host/common/SocketAddress.cpp | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/source/Host/common/SocketAddress.cpp b/source/Host/common/SocketAddress.cpp index 1f5de2e5df18..48c3ec1c48ed 100644 --- a/source/Host/common/SocketAddress.cpp +++ b/source/Host/common/SocketAddress.cpp @@ -89,6 +89,10 @@ SocketAddress::SocketAddress(const struct sockaddr_storage &s) {    m_socket_addr.sa_storage = s;  } +SocketAddress::SocketAddress(const struct addrinfo *addr_info) { +  *this = addr_info; +} +  //----------------------------------------------------------------------  // SocketAddress copy constructor  //---------------------------------------------------------------------- @@ -244,6 +248,24 @@ bool SocketAddress::getaddrinfo(const char *host, const char *service,    return result;  } +std::vector<SocketAddress> SocketAddress::GetAddressInfo(const char *hostname, +                                                       const char *servname) { +  std::vector<SocketAddress> addr_list; + +  struct addrinfo *service_info_list = NULL; +  int err = ::getaddrinfo(hostname, servname, NULL, &service_info_list); +  if (err == 0 && service_info_list) { +    for (struct addrinfo *service_ptr = service_info_list; service_ptr != NULL; +         service_ptr = service_ptr->ai_next) { +      addr_list.emplace_back(SocketAddress(service_ptr)); +    } +  } + +  if (service_info_list) +    ::freeaddrinfo(service_info_list); +  return addr_list; +} +  bool SocketAddress::SetToLocalhost(sa_family_t family, uint16_t port) {    switch (family) {    case AF_INET: @@ -287,3 +309,29 @@ bool SocketAddress::SetToAnyAddress(sa_family_t family, uint16_t port) {    Clear();    return false;  } + +bool SocketAddress::IsAnyAddr() const { +  return (GetFamily() == AF_INET) +             ? m_socket_addr.sa_ipv4.sin_addr.s_addr == htonl(INADDR_ANY) +             : 0 == memcmp(&m_socket_addr.sa_ipv6.sin6_addr, &in6addr_any, 16); +} + +bool SocketAddress::operator==(const SocketAddress &rhs) const { +  if (GetFamily() != rhs.GetFamily()) +    return false; +  if (GetLength() != rhs.GetLength()) +    return false; +  switch (GetFamily()) { +  case AF_INET: +    return m_socket_addr.sa_ipv4.sin_addr.s_addr == +           rhs.m_socket_addr.sa_ipv4.sin_addr.s_addr; +  case AF_INET6: +    return 0 == memcmp(&m_socket_addr.sa_ipv6.sin6_addr, +                       &rhs.m_socket_addr.sa_ipv6.sin6_addr, 16); +  } +  return false; +} + +bool SocketAddress::operator!=(const SocketAddress &rhs) const { +  return !(*this == rhs); +}  | 
