diff --git a/profiler/build/win32/Tracy.vcxproj b/profiler/build/win32/Tracy.vcxproj
index e539a607..7bc3ddc6 100644
--- a/profiler/build/win32/Tracy.vcxproj
+++ b/profiler/build/win32/Tracy.vcxproj
@@ -123,6 +123,7 @@
+
NotSet
NotSet
@@ -185,6 +186,7 @@
+
diff --git a/profiler/build/win32/Tracy.vcxproj.filters b/profiler/build/win32/Tracy.vcxproj.filters
index d7908bb6..8b89f6f9 100644
--- a/profiler/build/win32/Tracy.vcxproj.filters
+++ b/profiler/build/win32/Tracy.vcxproj.filters
@@ -99,6 +99,9 @@
server
+
+ src
+
@@ -269,6 +272,9 @@
server
+
+ src
+
diff --git a/profiler/src/ResolvService.cpp b/profiler/src/ResolvService.cpp
new file mode 100644
index 00000000..845258e3
--- /dev/null
+++ b/profiler/src/ResolvService.cpp
@@ -0,0 +1,55 @@
+#ifdef _MSC_VER
+# include
+#else
+# include
+# include
+# include
+#endif
+
+#include "ResolvService.hpp"
+
+ResolvService::ResolvService()
+ : m_exit( false )
+ , m_thread( [this] { Worker(); } )
+{
+}
+
+ResolvService::~ResolvService()
+{
+ m_exit.store( true, std::memory_order_relaxed );
+ m_cv.notify_one();
+ m_thread.join();
+}
+
+void ResolvService::Query( uint32_t ip, const std::function& callback )
+{
+ std::lock_guard lock( m_lock );
+ m_queue.emplace_back( QueueItem { ip, callback } );
+ m_cv.notify_one();
+}
+
+void ResolvService::Worker()
+{
+ struct sockaddr_in addr = {};
+ addr.sin_family = AF_INET;
+ addr.sin_port = 8086;
+
+ char buf[128];
+
+ for(;;)
+ {
+ std::unique_lock lock( m_lock );
+ m_cv.wait( lock, [this] { return !m_queue.empty() || m_exit.load( std::memory_order_relaxed ); } );
+ if( m_exit.load( std::memory_order_relaxed ) ) return;
+ auto query = m_queue.back();
+ m_queue.pop_back();
+ lock.unlock();
+
+ addr.sin_addr.s_addr = query.ip;
+ if( getnameinfo( (const struct sockaddr*)&addr, sizeof( sockaddr_in ), buf, 128, nullptr, 0, NI_NOFQDN ) != 0 )
+ {
+ inet_ntop( AF_INET, &query.ip, buf, 17 );
+ }
+ query.callback( buf );
+ }
+}
diff --git a/profiler/src/ResolvService.hpp b/profiler/src/ResolvService.hpp
new file mode 100644
index 00000000..f75c13f4
--- /dev/null
+++ b/profiler/src/ResolvService.hpp
@@ -0,0 +1,37 @@
+#ifndef __RESOLVSERVICE_HPP__
+#define __RESOLVSERVICE_HPP__
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+class ResolvService
+{
+ struct QueueItem
+ {
+ uint32_t ip;
+ std::function callback;
+ };
+
+public:
+ ResolvService();
+ ~ResolvService();
+
+ void Query( uint32_t ip, const std::function& callback );
+
+private:
+ void Worker();
+
+ std::atomic m_exit;
+ std::mutex m_lock;
+ std::condition_variable m_cv;
+ std::vector m_queue;
+ std::thread m_thread;
+};
+
+#endif