diff --git a/include/grpcpp/server_builder_impl.h b/include/grpcpp/server_builder_impl.h
index 7f85e807d07..9c69adc9147 100644
--- a/include/grpcpp/server_builder_impl.h
+++ b/include/grpcpp/server_builder_impl.h
@@ -112,6 +112,10 @@ class ServerBuilder {
   ///
   /// It can be invoked multiple times.
   ///
+  /// If port is not provided in the \a addr (e.g., "1.2.3.4:" or "1.2.3.4"),
+  /// the default port (i.e., https) is used.  To request an ephemeral port,
+  /// \a addr must include 0 as the port number (e.g., "1.2.3.4:0").
+  ///
   /// \param addr_uri The address to try to bind to the server in URI form. If
   /// the scheme name is omitted, "dns:///" is assumed. To bind to any address,
   /// please use IPv6 any, i.e., [::]:<port>, which also accepts IPv4
diff --git a/src/core/lib/gprpp/host_port.cc b/src/core/lib/gprpp/host_port.cc
index e7f0e4461e9..13b63eb902b 100644
--- a/src/core/lib/gprpp/host_port.cc
+++ b/src/core/lib/gprpp/host_port.cc
@@ -44,10 +44,7 @@ int JoinHostPort(UniquePtr<char>* out, const char* host, int port) {
   return ret;
 }
 
-namespace {
-bool DoSplitHostPort(StringView name, StringView* host, StringView* port,
-                     bool* has_port) {
-  *has_port = false;
+bool SplitHostPort(StringView name, StringView* host, StringView* port) {
   if (name[0] == '[') {
     /* Parse a bracketed host, typically an IPv6 literal. */
     const size_t rbracket = name.find(']', 1);
@@ -61,7 +58,6 @@ bool DoSplitHostPort(StringView name, StringView* host, StringView* port,
     } else if (name[rbracket + 1] == ':') {
       /* ]:<port?> */
       *port = name.substr(rbracket + 2, name.size() - rbracket - 2);
-      *has_port = true;
     } else {
       /* ]<invalid> */
       return false;
@@ -80,7 +76,6 @@ bool DoSplitHostPort(StringView name, StringView* host, StringView* port,
       /* Exactly 1 colon.  Split into host:port. */
       *host = name.substr(0, colon);
       *port = name.substr(colon + 1, name.size() - colon - 1);
-      *has_port = true;
     } else {
       /* 0 or 2+ colons.  Bare hostname or IPv6 litearal. */
       *host = name;
@@ -89,12 +84,6 @@ bool DoSplitHostPort(StringView name, StringView* host, StringView* port,
   }
   return true;
 }
-}  // namespace
-
-bool SplitHostPort(StringView name, StringView* host, StringView* port) {
-  bool unused;
-  return DoSplitHostPort(name, host, port, &unused);
-}
 
 bool SplitHostPort(StringView name, UniquePtr<char>* host,
                    UniquePtr<char>* port) {
@@ -102,14 +91,12 @@ bool SplitHostPort(StringView name, UniquePtr<char>* host,
   GPR_DEBUG_ASSERT(port != nullptr && *port == nullptr);
   StringView host_view;
   StringView port_view;
-  bool has_port;
-  const bool ret = DoSplitHostPort(name, &host_view, &port_view, &has_port);
+  const bool ret = SplitHostPort(name, &host_view, &port_view);
   if (ret) {
-    // We always set the host, but port is set only when DoSplitHostPort find a
-    // port in the string, to remain backward compatible with the old
-    // gpr_split_host_port API.
+    // We always set the host, but port is set only when it's non-empty,
+    // to remain backward compatible with the old split_host_port API.
     *host = host_view.dup();
-    if (has_port) {
+    if (!port_view.empty()) {
       *port = port_view.dup();
     }
   }
diff --git a/test/core/gprpp/host_port_test.cc b/test/core/gprpp/host_port_test.cc
index cfe0eddb036..3b392da66e8 100644
--- a/test/core/gprpp/host_port_test.cc
+++ b/test/core/gprpp/host_port_test.cc
@@ -71,9 +71,7 @@ static void test_split_host_port() {
   split_host_port_expect("", "", nullptr, true);
   split_host_port_expect("[a:b]", "a:b", nullptr, true);
   split_host_port_expect("1.2.3.4", "1.2.3.4", nullptr, true);
-  split_host_port_expect("0.0.0.0:", "0.0.0.0", "", true);
   split_host_port_expect("a:b:c::", "a:b:c::", nullptr, true);
-  split_host_port_expect("[a:b:c::]:", "a:b:c::", "", true);
   split_host_port_expect("[a:b]:30", "a:b", "30", true);
   split_host_port_expect("1.2.3.4:30", "1.2.3.4", "30", true);
   split_host_port_expect(":30", "", "30", true);