diff options
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 73 |
1 files changed, 40 insertions, 33 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index deb8e18fa66..201d63f5bbe 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -223,20 +223,6 @@ IceInternal::createSocket(bool udp) return fd; } -static void -closeSocketNoThrow(SOCKET fd) -{ -#ifdef _WIN32 - int error = WSAGetLastError(); - closesocket(fd); - WSASetLastError(error); -#else - int error = errno; - close(fd); - errno = error; -#endif -} - void IceInternal::closeSocket(SOCKET fd) { @@ -260,6 +246,20 @@ IceInternal::closeSocket(SOCKET fd) errno = error; #endif } + +void +IceInternal::closeSocketNoThrow(SOCKET fd) +{ +#ifdef _WIN32 + int error = WSAGetLastError(); + closesocket(fd); + WSASetLastError(error); +#else + int error = errno; + close(fd); + errno = error; +#endif +} void IceInternal::shutdownSocketWrite(SOCKET fd) @@ -1200,33 +1200,18 @@ IceInternal::fdToString(SOCKET fd) struct sockaddr_in localAddr; fdToLocalAddress(fd, localAddr); - bool peerNotConnected = false; - socklen_t remoteLen = static_cast<socklen_t>(sizeof(struct sockaddr_in)); struct sockaddr_in remoteAddr; - if(getpeername(fd, reinterpret_cast<struct sockaddr*>(&remoteAddr), &remoteLen) == SOCKET_ERROR) - { - if(notConnected()) - { - peerNotConnected = true; - } - else - { - closeSocketNoThrow(fd); - SocketException ex(__FILE__, __LINE__); - ex.error = getSocketErrno(); - throw ex; - } - } + bool peerConnected = fdToRemoteAddress(fd, remoteAddr); ostringstream s; s << "local address = " << addrToString(localAddr); - if(peerNotConnected) + if(peerConnected) { - s << "\nremote address = <not connected>"; + s << "\nremote address = " << addrToString(remoteAddr); } else { - s << "\nremote address = " << addrToString(remoteAddr); + s << "\nremote address = <not connected>"; } return s.str(); } @@ -1244,6 +1229,28 @@ IceInternal::fdToLocalAddress(SOCKET fd, struct sockaddr_in& addr) } } +bool +IceInternal::fdToRemoteAddress(SOCKET fd, struct sockaddr_in& addr) +{ + socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_in)); + if(getpeername(fd, reinterpret_cast<struct sockaddr*>(&addr), &len) == SOCKET_ERROR) + { + if(notConnected()) + { + return false; + } + else + { + closeSocketNoThrow(fd); + SocketException ex(__FILE__, __LINE__); + ex.error = getSocketErrno(); + throw ex; + } + } + + return true; +} + string IceInternal::addrToString(const struct sockaddr_in& addr) { |