From d20fee4a64aa16a2fcc8a85b8b2add19984371c7 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Tue, 19 Sep 2023 17:06:00 +0800 Subject: [PATCH] Remote desk client supports MacOS --- remote_desk_client/remote_desk_client.cpp | 67 +++++++++++++++++------ remote_desk_server/remote_desk_server.cpp | 39 +++++++++++-- xmake.lua | 16 +++++- 3 files changed, 99 insertions(+), 23 deletions(-) diff --git a/remote_desk_client/remote_desk_client.cpp b/remote_desk_client/remote_desk_client.cpp index 4cf8f68..25909c4 100644 --- a/remote_desk_client/remote_desk_client.cpp +++ b/remote_desk_client/remote_desk_client.cpp @@ -1,6 +1,12 @@ #ifdef _WIN32 #include #include +#elif __APPLE__ +#include +#include +#include +#include +#include #endif #include @@ -67,6 +73,18 @@ inline void FreshVideo() { SDL_RenderClear(sdlRenderer); SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect); SDL_RenderPresent(sdlRenderer); + + frame_count++; + end_time = SDL_GetTicks(); + elapsed_time = end_time - start_time; + if (elapsed_time >= 1000) { + fps = frame_count / (elapsed_time / 1000); + frame_count = 0; + window_title = "Remote Desk Client FPS [" + std::to_string(fps) + "]"; + // For MacOS, UI frameworks can only be called from the main thread + SDL_SetWindowTitle(screen, window_title.c_str()); + start_time = end_time; + } } inline int ProcessMouseKeyEven(SDL_Event &ev) { @@ -163,16 +181,6 @@ void ReceiveVideoBuffer(const char *data, size_t size, const char *user_id, SDL_Event event; event.type = REFRESH_EVENT; SDL_PushEvent(&event); - frame_count++; - end_time = SDL_GetTicks(); - elapsed_time = end_time - start_time; - if (elapsed_time >= 1000) { - fps = frame_count / (elapsed_time / 1000); - frame_count = 0; - window_title = "Remote Desk Client [FPS " + std::to_string(fps) + "]"; - SDL_SetWindowTitle(screen, window_title.data()); - start_time = end_time; - } } void ReceiveAudioBuffer(const char *data, size_t size, const char *user_id, @@ -187,24 +195,50 @@ void ReceiveDataBuffer(const char *data, size_t size, const char *user_id, << std::endl; } -std::string GetMac() { +std::string GetMac(char *mac_addr) { + int len = 0; +#ifdef _WIN32 IP_ADAPTER_INFO adapterInfo[16]; DWORD bufferSize = sizeof(adapterInfo); - char mac[10]; - int len = 0; DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize); if (result == ERROR_SUCCESS) { PIP_ADAPTER_INFO adapter = adapterInfo; while (adapter) { for (UINT i = 0; i < adapter->AddressLength; i++) { - len += sprintf(mac + len, "%.2X", adapter->Address[i]); + len += sprintf(mac_addr + len, "%.2X", adapter->Address[i]); } break; } } +#else + std::string ifName = "en0"; - return mac; + struct ifaddrs *addrs; + struct ifaddrs *cursor; + const struct sockaddr_dl *dlAddr; + + if (!getifaddrs(&addrs)) { + cursor = addrs; + while (cursor != 0) { + const struct sockaddr_dl *socAddr = + (const struct sockaddr_dl *)cursor->ifa_addr; + if ((cursor->ifa_addr->sa_family == AF_LINK) && + (socAddr->sdl_type == IFT_ETHER) && + strcmp("en0", cursor->ifa_name) == 0) { + dlAddr = (const struct sockaddr_dl *)cursor->ifa_addr; + const unsigned char *base = + (const unsigned char *)&dlAddr->sdl_data[dlAddr->sdl_nlen]; + for (int i = 0; i < dlAddr->sdl_alen; i++) { + len += sprintf(mac_addr + len, "%.2X", base[i]); + } + } + cursor = cursor->ifa_next; + } + freeifaddrs(addrs); + } +#endif + return mac_addr; } int main() { @@ -218,7 +252,8 @@ int main() { params.on_receive_data_buffer = ReceiveDataBuffer; std::string transmission_id = "000001"; - std::string user_id = GetMac(); + char mac_addr[10]; + std::string user_id = "C-" + std::string(GetMac(mac_addr)); peer = CreatePeer(¶ms); JoinConnection(peer, transmission_id.c_str(), user_id.c_str()); diff --git a/remote_desk_server/remote_desk_server.cpp b/remote_desk_server/remote_desk_server.cpp index b95a68a..8dc8b9b 100644 --- a/remote_desk_server/remote_desk_server.cpp +++ b/remote_desk_server/remote_desk_server.cpp @@ -127,24 +127,50 @@ void RemoteDeskServer::ReceiveDataBuffer(const char *data, size_t size, } } -std::string GetMac() { +std::string GetMac(char *mac_addr) { + int len = 0; +#ifdef _WIN32 IP_ADAPTER_INFO adapterInfo[16]; DWORD bufferSize = sizeof(adapterInfo); - char mac[10]; - int len = 0; DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize); if (result == ERROR_SUCCESS) { PIP_ADAPTER_INFO adapter = adapterInfo; while (adapter) { for (UINT i = 0; i < adapter->AddressLength; i++) { - len += sprintf(mac + len, "%.2X", adapter->Address[i]); + len += sprintf(mac_addr + len, "%.2X", adapter->Address[i]); } break; } } +#else + std::string ifName = "en0"; - return mac; + struct ifaddrs *addrs; + struct ifaddrs *cursor; + const struct sockaddr_dl *dlAddr; + + if (!getifaddrs(&addrs)) { + cursor = addrs; + while (cursor != 0) { + const struct sockaddr_dl *socAddr = + (const struct sockaddr_dl *)cursor->ifa_addr; + if ((cursor->ifa_addr->sa_family == AF_LINK) && + (socAddr->sdl_type == IFT_ETHER) && + strcmp("en0", cursor->ifa_name) == 0) { + dlAddr = (const struct sockaddr_dl *)cursor->ifa_addr; + const unsigned char *base = + (const unsigned char *)&dlAddr->sdl_data[dlAddr->sdl_nlen]; + for (int i = 0; i < dlAddr->sdl_alen; i++) { + len += sprintf(mac_addr + len, "%.2X", base[i]); + } + } + cursor = cursor->ifa_next; + } + freeifaddrs(addrs); + } +#endif + return mac_addr; } int RemoteDeskServer::Init() { @@ -158,7 +184,8 @@ int RemoteDeskServer::Init() { params.on_receive_data_buffer = ReceiveDataBuffer; std::string transmission_id = "000001"; - std::string user_id = "Server-" + GetMac(); + char mac_addr[10]; + std::string user_id = "S-" + std::string(GetMac(mac_addr)); peer = CreatePeer(¶ms); CreateConnection(peer, transmission_id.c_str(), user_id.c_str()); diff --git a/xmake.lua b/xmake.lua index 62ec3e7..3cfcb86 100644 --- a/xmake.lua +++ b/xmake.lua @@ -8,6 +8,8 @@ set_languages("c++17") add_requires("spdlog 1.11.0", {system = false}) add_defines("UNICODE") +add_requires("sdl2", {system = false}) + if is_os("windows") then add_ldflags("/SUBSYSTEM:CONSOLE") add_links("Shell32", "windowsapp", "dwmapi", "User32", "kernel32") @@ -17,6 +19,9 @@ elseif is_os("linux") then add_requires("ffmpeg 5.1.2", {system = false}) add_links("pthread") set_config("cxxflags", "-fPIC") +elseif is_os("macosx") then + add_requires("ffmpeg 5.1.2", {system = false}) + -- add_requires("vcpkg::sdl2 2.28.3", {system = false}) end add_packages("spdlog") @@ -53,13 +58,22 @@ target("remote_desk_client") set_kind("binary") add_deps("projectx") add_packages("log") - add_packages("vcpkg::sdl2") + if is_os("windows") then + add_packages("vcpkg::sdl2") + elseif is_os("macosx") then + -- add_packages("vcpkg::sdl2") + add_packages("sdl2") + add_packages("ffmpeg") + end add_files("remote_desk_client/*.cpp") add_includedirs("../../src/interface") if is_os("windows") then add_links("SDL2-static", "SDL2main", "gdi32", "winmm", "setupapi", "version", "Imm32", "iphlpapi") + elseif is_os("macosx") then + add_links("SDL2") end + -- target("remote_desk") -- set_kind("binary")