211 std::string& a_serv) {
212 TRACE(
"Executing split_addr_port()")
214 if (a_addr_str.empty()) {
221 std::string addr_str;
222 std::string serv_str;
225 if (a_addr_str.length() < 2) {
228 addr_str = a_addr_str;
230 }
else if (a_addr_str.front() ==
'[') {
232 if ((pos = a_addr_str.find(
"]:")) != std::string::npos) {
233 addr_str = a_addr_str.substr(0, pos + 1);
234 serv_str = a_addr_str.substr(pos + 2);
235 if (serv_str.empty())
238 addr_str = a_addr_str;
241 }
else if (a_addr_str.front() ==
':' && a_addr_str[1] ==
':') {
243 addr_str = a_addr_str;
245 }
else if (a_addr_str.front() ==
':') {
248 switch (to_port(a_addr_str.substr(1), &port)) {
251 serv_str = a_addr_str.substr(1);
255 serv_str = std::to_string(port);
261 }
else if (a_addr_str.find_first_of(
'.') != std::string::npos) {
263 if ((pos = a_addr_str.find_last_of(
':')) != std::string::npos) {
264 addr_str = a_addr_str.substr(0, pos);
265 serv_str = a_addr_str.substr(pos + 1);
266 if (serv_str.empty())
270 addr_str = a_addr_str;
272 }
else if (std::ranges::count(a_addr_str,
':') == 1) {
274 pos = a_addr_str.find_last_of(
':');
275 addr_str = a_addr_str.substr(0, pos);
276 serv_str = a_addr_str.substr(pos + 1);
277 if (serv_str.empty())
282 switch (to_port(a_addr_str, &port)) {
286 addr_str = a_addr_str;
290 serv_str = std::to_string(port);
299 switch (to_port(serv_str)) {
309 if (addr_str.length() >= 4 && addr_str.front() ==
'[' &&
310 addr_str.back() ==
']' && std::ranges::count(addr_str,
':') >= 2 &&
311 addr_str.find_first_of(
'.') == std::string::npos) {
314 a_addr = addr_str.substr(1, addr_str.length() - 2);
321 const std::regex addr_regex(
322 "\\[::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}"
324 "9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\]",
325 std::regex_constants::icase);
327 if (std::regex_match(addr_str, addr_regex)) {
329 a_addr = addr_str.substr(1, addr_str.length() - 2);
341 throw std::range_error(
342 UPnPsdk_LOGEXCEPT(
"MSG1127")
"Number string from \"" + a_addr_str +
343 "\" for port is out of range 0..65535.");
386 TRACE2(
this,
" Executing SSockaddr::operator=(" + a_addr_str +
")")
388 if (a_addr_str.empty()) {
390 ::memset(&m_sa_union, 0,
sizeof(m_sa_union));
391 m_sa_union.ss.ss_family = AF_UNSPEC;
394 std::string ai_addr_str;
395 std::string ai_port_str;
402 if (ai_addr_str.empty()) {
404 if (to_port(ai_port_str, &
port) != 0)
406 m_sa_union.sin6.sin6_port = htons(
port);
414 hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
415 hints.ai_family = AF_UNSPEC;
416 ::addrinfo* res{
nullptr};
419 int ret = umock::netdb_h.getaddrinfo(ai_addr_str.c_str(),
420 ai_port_str.c_str(), &hints, &res);
422 umock::netdb_h.freeaddrinfo(res);
425 if (ai_port_str.empty()) {
427 in_port_t
port = m_sa_union.sin6.sin6_port;
428 ::memcpy(&m_sa_union, res->ai_addr,
sizeof(m_sa_union));
429 m_sa_union.sin6.sin6_port =
port;
431 ::memcpy(&m_sa_union, res->ai_addr,
sizeof(m_sa_union));
433 umock::netdb_h.freeaddrinfo(res);
440 throw std::invalid_argument(
441 UPnPsdk_LOGEXCEPT(
"MSG1043")
"Invalid netaddress \"" + a_addr_str +
474 switch (m_sa_union.ss.ss_family) {
481 UPnPsdk_LOGERR(
"MSG1129")
"Unsupported address family "
482 << std::to_string(m_sa_union.ss.ss_family)
483 <<
". Continue with unspecified netaddress \"\".\n";
489 char addrStr[39 + 1 +
491 int ret = ::getnameinfo(&m_sa_union.sa,
sizeof(m_sa_union.ss), addrStr,
492 sizeof(addrStr),
nullptr, 0, NI_NUMERICHOST);
500 "MSG1036")
"Failed to get netaddress with address family "
501 << std::to_string(m_sa_union.ss.ss_family) <<
": "
502 << ::gai_strerror(ret)
503 <<
". Continue with unspecified netaddress \"\".\n";
510 if (m_sa_union.ss.ss_family == AF_INET6)
511 return '[' + std::string(addrStr) +
']';
513 return std::string(addrStr);
572 return ((m_sa_union.ss.ss_family == AF_INET6 &&
573 IN6_IS_ADDR_LOOPBACK(&m_sa_union.sin6.sin6_addr)) ||
574 (m_sa_union.ss.ss_family == AF_INET &&
576 ntohl(m_sa_union.sin.sin_addr.s_addr) >= 2130706432 &&
577 ntohl(m_sa_union.sin.sin_addr.s_addr) <= 2147483647));