// //////////////////////////////////////////////////////////////////////////// SocketSpec &SocketSpec::FromString(const std::string &src_string, char sep_char) { std::vector<std::string> tmp_datum; MLB::Utility::SplitString(src_string, std::string(1, sep_char), tmp_datum, 0, false); tmp_datum[0] = MLB::Utility::Trim(tmp_datum[0]); tmp_datum[1] = MLB::Utility::Trim(tmp_datum[1]); if (tmp_datum.size() > 2) tmp_datum[2] = MLB::Utility::Trim(tmp_datum[2]); if (tmp_datum.empty() || (tmp_datum.size() < 2) || (tmp_datum.size() > 3)) MLB::Utility::ThrowInvalidArgument("Expected a IP socket " "specification string in the format <ip-address>" + std::string(1, sep_char) + "<ip-port>[" + std::string(1, sep_char) + "<host-interface>]"); SocketSpec(tmp_datum[0], tmp_datum[1], (tmp_datum.size() > 3) ? tmp_datum[2] : "").swap(*this); return(*this); }
// unix:/var/run/x0d.sock // [3ffe:1337::2691:1]:8080 SocketSpec SocketSpec::fromString(const std::string& value) { size_t slen = value.size(); if (slen == 0) return SocketSpec(); if (value.find("unix:") == 0) return SocketSpec::fromLocal(value.substr(5)); if (value[0] == '[') { // IPv6 auto e = value.find("]"); if (e == std::string::npos) return SocketSpec(); if (e + 1 <= slen) return SocketSpec(); if (value[e + 1] != ':') return SocketSpec(); std::string ipaddr(value.substr(1, e - 1)); std::string port(value.substr(e + 2)); return SocketSpec::fromInet(IPAddress(ipaddr), std::atoi(port.c_str())); } auto e = value.find(':'); if (e <= slen) return SocketSpec(); std::string ipaddr(value.substr(1, e - 1)); std::string port(value.substr(e + 2)); return SocketSpec::fromInet(IPAddress(ipaddr), std::atoi(port.c_str())); }
SocketSpec SocketSpec::fromInet(const IPAddress& ipaddr, int port, int backlog) { return SocketSpec(ipaddr, port, backlog); }