24 #include <arpa/inet.h>
25 #include <core/exceptions/system.h>
26 #include <core/threading/mutex_locker.h>
27 #include <netcomm/utils/resolver.h>
28 #include <netcomm/utils/resolver_thread.h>
29 #include <netinet/in.h>
30 #include <sys/types.h>
31 #include <utils/system/hostinfo.h>
87 addr2name_cache.clear();
88 name2addr_cache.clear();
92 resolver_thread->
start();
103 resolver_thread->
cancel();
104 resolver_thread->
join();
105 delete resolver_thread;
118 cache_timeout_ = sec;
127 return cache_timeout_;
136 addr2name_cache.
lock();
137 addr2name_cache.clear();
139 name2addr_cache.
lock();
140 while (!name2addr_cache.empty()) {
141 n2acit = name2addr_cache.begin();
142 free(n2acit->second.first);
143 name2addr_cache.erase(n2acit);
171 name2addr_cache.
lock();
173 if (name2addr_cache.find((
char *)name) != name2addr_cache.end()) {
175 std::pair<struct sockaddr *, time_t> &nrec = name2addr_cache[(
char *)name];
176 if (nrec.second <= time(NULL)) {
181 *addrlen =
sizeof(
struct sockaddr_in);
204 struct sockaddr **addr,
210 struct sockaddr *_addr;
213 name_resolved(strdup(name), _addr, _addrlen);
236 addr2name_cache.
lock();
237 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
239 if (addr2name_cache.find(saddr->sin_addr.s_addr) != addr2name_cache.end()) {
241 std::pair<std::string, time_t> &nrec = addr2name_cache[saddr->sin_addr.s_addr];
243 if (nrec.second <= time(NULL)) {
251 char tmp[INET_ADDRSTRLEN];
252 if (inet_ntop(AF_INET, &(saddr->sin_addr), tmp,
sizeof(tmp))) {
253 char *n = strdup(tmp);
255 addr2name_cache[saddr->sin_addr.s_addr] =
256 std::pair<char *, time_t>(n, time(NULL) + cache_timeout_);
295 NetworkNameResolver::name_resolved(std::string name,
struct sockaddr *addr, socklen_t addrlen)
297 name2addr_cache.
lock();
298 if ((n2acit = name2addr_cache.find(name)) != name2addr_cache.end()) {
300 free(n2acit->second.first);
301 name2addr_cache.erase(n2acit);
303 name2addr_cache[name] = std::pair<struct sockaddr *, time_t>(addr, time(NULL) + cache_timeout_);
308 NetworkNameResolver::addr_resolved(
struct sockaddr *addr,
313 addr2name_cache.
lock();
314 struct sockaddr_in *saddr = (
struct sockaddr_in *)addr;
316 if ((a2ncit = addr2name_cache.find(saddr->sin_addr.s_addr)) != addr2name_cache.end()) {
318 addr2name_cache.erase(a2ncit);
319 addr2name_cache[saddr->sin_addr.s_addr] = std::make_pair(name, time(NULL) + cache_timeout_);
322 if ((a2ncit = addr2name_cache.find(saddr->sin_addr.s_addr)) == addr2name_cache.end()) {
323 addr2name_cache[saddr->sin_addr.s_addr] = std::make_pair(name, 0);
331 NetworkNameResolver::name_resolution_failed(std::string name)
336 NetworkNameResolver::address_resolution_failed(
struct sockaddr *addr, socklen_t addrlen)
347 return host_info_->
name();