diff --git a/src/brpc/socket.cpp b/src/brpc/socket.cpp index ac1c37aebe..7e694220a6 100644 --- a/src/brpc/socket.cpp +++ b/src/brpc/socket.cpp @@ -582,9 +582,7 @@ int Socket::ResetFileDescriptor(int fd) { butil::get_remote_side(fd, &_remote_side); } // OK to fail, non-socket fd does not support this. - if (butil::get_local_side(fd, &_local_side) != 0) { - _local_side = butil::EndPoint(); - } + butil::get_local_side(fd, &_local_side); // FIXME : close-on-exec should be set by new syscalls or worse: set right // after fd-creation syscall. Setting at here has higher probabilities of @@ -720,6 +718,7 @@ int Socket::OnCreated(const SocketOptions& options) { _keytable_pool = options.keytable_pool; _tos = 0; _remote_side = options.remote_side; + _local_side = butil::EndPoint(); _on_edge_triggered_events = options.on_edge_triggered_events; _user = options.user; _conn = options.conn; diff --git a/test/brpc_socket_unittest.cpp b/test/brpc_socket_unittest.cpp index e83eef7eed..3f9b88ad8d 100644 --- a/test/brpc_socket_unittest.cpp +++ b/test/brpc_socket_unittest.cpp @@ -354,6 +354,7 @@ TEST_F(SocketTest, single_threaded_connect_and_write) { global_sock = s.get(); ASSERT_TRUE(s.get()); ASSERT_EQ(-1, s->fd()); + ASSERT_EQ(butil::EndPoint(), s->local_side()); ASSERT_EQ(point, s->remote_side()); ASSERT_EQ(id, s->id()); for (size_t i = 0; i < 20; ++i) { @@ -415,6 +416,16 @@ TEST_F(SocketTest, single_threaded_connect_and_write) { ASSERT_EQ(-1, messenger->listened_fd()); ASSERT_EQ(-1, fcntl(listening_fd, F_GETFD)); ASSERT_EQ(EBADF, errno); + + // The socket object is likely to be reused, + // and the local side should be initialized. + ASSERT_EQ(0, brpc::Socket::Create(options, &id)); + brpc::SocketUniquePtr s; + ASSERT_EQ(0, brpc::Socket::Address(id, &s)); + ASSERT_TRUE(s.get()); + ASSERT_EQ(-1, s->fd()); + ASSERT_EQ(butil::EndPoint(), s->local_side()); + ASSERT_EQ(point, s->remote_side()); } #define NUMBER_WIDTH 16