const char *Ip4ToString(in_addr_t address) { in_addr temp; temp.s_addr = address; return Ip4ToString(temp); }
const char *Ip4ToString(const in_addr &address, uint16_t port) { return Ip4ToString(address.s_addr, port); }
const char* sockAddrBase::ToString(bool includePort /*true*/) const { in_port_t port = includePort ? Port() : 0; if (IsIPv4()) { if (port == 0) return Ip4ToString(getIPv4Storage()->sin_addr); else return Ip4ToString(getIPv4Storage()->sin_addr, port); } else if (IsIPv6()) { const sockaddr_in6 *storage = getIPv6Storage(); if (storage->sin6_scope_id == 0 && !port) { // Just IPv6 address char *buffer; size_t bufsize = GetSmallTLSBuffer(&buffer); if (!bufsize) return "<memerror>"; if (!inet_ntop(AF_INET6, &storage->sin6_addr, buffer, bufsize)) return "<Invalid Address>"; return buffer; } else { // composite address char ifNameBuf[IF_NAMESIZE]; char addrStrBuf[INET6_ADDRSTRLEN]; const char *ifName = NULL; const char *addrStr = NULL; if (storage->sin6_scope_id) { ifName = if_indextoname(storage->sin6_scope_id, ifNameBuf); if (!ifName) ifName = "???"; } addrStr = inet_ntop(AF_INET6, &storage->sin6_addr, addrStrBuf, sizeof(addrStrBuf)); if (!addrStr) addrStr = "<Invalid IPv6>"; if (port) { if (ifName) return FormatShortStr("[%s%%%s]:%d", addrStr, ifName, (int)port); else return FormatShortStr("[%s]:%d", addrStr, (int)port); } else { if (ifName) return FormatShortStr("%s%%%s", addrStr, ifName); else { LogVerify(false); // should never happen return FormatShortStr("%s", addrStr); } } } } else return "<Invalid Address>"; }