diff options
| -rw-r--r-- | source/Host/common/TCPSocket.cpp | 11 | ||||
| -rw-r--r-- | unittests/Host/SocketTest.cpp | 11 | 
2 files changed, 19 insertions, 3 deletions
| diff --git a/source/Host/common/TCPSocket.cpp b/source/Host/common/TCPSocket.cpp index a7af93f10a7f..f896944bb1b3 100644 --- a/source/Host/common/TCPSocket.cpp +++ b/source/Host/common/TCPSocket.cpp @@ -198,9 +198,14 @@ Status TCPSocket::Listen(llvm::StringRef name, int backlog) {      ::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, option_value_p,                   sizeof(option_value)); -    address.SetPort(port); - -    int err = ::bind(fd, &address.sockaddr(), address.GetLength()); +    SocketAddress listen_address = address; +    if(!listen_address.IsLocalhost()) +      listen_address.SetToAnyAddress(address.GetFamily(), port); +    else +      listen_address.SetPort(port); + +    int err = +        ::bind(fd, &listen_address.sockaddr(), listen_address.GetLength());      if (-1 != err)        err = ::listen(fd, backlog); diff --git a/unittests/Host/SocketTest.cpp b/unittests/Host/SocketTest.cpp index d8fdc593ed46..59f59fc0ada7 100644 --- a/unittests/Host/SocketTest.cpp +++ b/unittests/Host/SocketTest.cpp @@ -220,3 +220,14 @@ TEST_F(SocketTest, UDPConnect) {    EXPECT_TRUE(error.Success());    EXPECT_TRUE(socket_up->IsValid());  } + +TEST_F(SocketTest, TCPListen0GetPort) { +  Socket *server_socket; +  Predicate<uint16_t> port_predicate; +  port_predicate.SetValue(0, eBroadcastNever); +  Status err = +      Socket::TcpListen("10.10.12.3:0", false, server_socket, &port_predicate); +  std::unique_ptr<TCPSocket> socket_up((TCPSocket*)server_socket); +  EXPECT_TRUE(socket_up->IsValid()); +  EXPECT_NE(socket_up->GetLocalPortNumber(), 0); +} | 
