X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2Fio%2Fasync%2FAsyncSocket.cpp;h=f32da3a75ad8e25372cd75854ba222b9c48ff9c4;hp=6cd879d9a567843cd556f40b3d8a9009c638535d;hb=4c7a736d6529f22451a0ec965e093e7e318695e3;hpb=d71b7361e718b3ee9ed720ae65f6223dbb9823a1 diff --git a/folly/io/async/AsyncSocket.cpp b/folly/io/async/AsyncSocket.cpp index 6cd879d9..f32da3a7 100644 --- a/folly/io/async/AsyncSocket.cpp +++ b/folly/io/async/AsyncSocket.cpp @@ -1285,17 +1285,39 @@ bool AsyncSocket::isDetachable() const { return !ioHandler_.isHandlerRegistered() && !writeTimeout_.isScheduled(); } -void AsyncSocket::getLocalAddress(folly::SocketAddress* address) const { +void AsyncSocket::cacheAddresses() { + if (fd_ >= 0) { + try { + cacheLocalAddress(); + cachePeerAddress(); + } catch (const std::system_error& e) { + if (e.code() != std::error_code(ENOTCONN, std::system_category())) { + VLOG(1) << "Error caching addresses: " << e.code().value() << ", " + << e.code().message(); + } + } + } +} + +void AsyncSocket::cacheLocalAddress() const { if (!localAddr_.isInitialized()) { localAddr_.setFromLocalAddress(fd_); } - *address = localAddr_; } -void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const { +void AsyncSocket::cachePeerAddress() const { if (!addr_.isInitialized()) { addr_.setFromPeerAddress(fd_); } +} + +void AsyncSocket::getLocalAddress(folly::SocketAddress* address) const { + cacheLocalAddress(); + *address = localAddr_; +} + +void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const { + cachePeerAddress(); *address = addr_; }