diff options
author | Marc Laukien <marc@zeroc.com> | 2002-04-12 15:10:24 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2002-04-12 15:10:24 +0000 |
commit | 23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e (patch) | |
tree | dc57e5457b0d19447c080f7e55c8ac6f9edeae74 /cpp/src/Ice/Network.cpp | |
parent | WIN32->_WIN32 (diff) | |
download | ice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.tar.bz2 ice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.tar.xz ice-23a9e91ab61541591254d2f8fceb7c1d8e2cbe9e.zip |
brought getLocalHost() back; changes to IcePatch (not finished)
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rw-r--r-- | cpp/src/Ice/Network.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index f774fa8b8f5..6b20964273c 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -43,7 +43,9 @@ bool IceInternal::acceptInterrupted() { if (interrupted()) + { return true; + } #ifdef _WIN32 int error = WSAGetLastError(); @@ -610,6 +612,54 @@ IceInternal::getAddress(const string& host, int port, struct sockaddr_in& addr) } } +string +IceInternal::getLocalHost(bool numeric) +{ + char host[1024 + 1]; + if (gethostname(host, 1024) == SOCKET_ERROR) + { + SystemException ex(__FILE__, __LINE__); + ex.error = getSystemErrno(); + throw ex; + } + + { + IceUtil::Mutex::Lock sync(getHostByNameMutex); + + struct hostent* entry; + int retry = 5; + + do + { + entry = gethostbyname(host); + } +#ifdef WIN32 + while (!entry && WSAGetLastError() == WSATRY_AGAIN && --retry >= 0); +#else + while (!entry && h_errno == TRY_AGAIN && --retry >= 0); +#endif + + if (!entry) + { + DNSException ex(__FILE__, __LINE__); + ex.error = getDNSErrno(); + throw ex; + } + + if (numeric) + { + struct sockaddr_in addr; + memset(&addr, 0, sizeof(struct sockaddr_in)); + memcpy(&addr.sin_addr, entry->h_addr, entry->h_length); + return string(inet_ntoa(addr.sin_addr)); + } + else + { + return string(entry->h_name); + } + } +} + bool IceInternal::compareAddress(const struct sockaddr_in& addr1, const struct sockaddr_in& addr2) { |