Загрузка данных


struct Entry { std::string ip; std::optional<uint16_t> port; };

std::optional<Entry> ParseEntry(const std::string& s) {
    Entry e;
    auto colon = s.rfind(':');
    if (colon == std::string::npos) {
        e.ip = s;
    } else {
        e.ip = s.substr(0, colon);
        uint16_t p;
        if (!ParsePort(s.substr(colon + 1), &p)) return std::nullopt;
        e.port = p;
    }
    if (!IsValidIp(e.ip)) return std::nullopt;
    return e;
}