diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2025-01-24 14:40:25 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-24 14:40:25 -0600 |
| commit | 799b9d409290f97ac46103facbc09ba280d465e3 (patch) | |
| tree | 13fa96d81748ca096dc5890131ad448ecf3b4bc7 /Source | |
| parent | d0b7c96fdb7ea50d55bb3cf581e5820d7b27b7e1 (diff) | |
| parent | 3b856530031aff08567f0c2373f61b6324c327c4 (diff) | |
Merge pull request #13192 from jordan-woyak/netplay-win32-interface-list
NetPlay: Implement GetInterfaceListInternal for Windows.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Core/NetPlayServer.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index 77a52e814b..cf21adfdc4 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -84,6 +84,10 @@ #include <ifaddrs.h> #endif #include <arpa/inet.h> +#else +#include <iphlpapi.h> +#include <winsock2.h> +#include <ws2tcpip.h> #endif namespace NetPlay @@ -2323,7 +2327,33 @@ std::vector<std::pair<std::string, std::string>> NetPlayServer::GetInterfaceList { std::vector<std::pair<std::string, std::string>> result; #if defined(_WIN32) + ULONG buffer_size = 0; + GetAdaptersAddresses(AF_INET, 0, nullptr, nullptr, &buffer_size); + + std::vector<char> buffer(buffer_size); + auto* const adapters = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data()); + const ULONG adapters_result = GetAdaptersAddresses(AF_INET, 0, nullptr, adapters, &buffer_size); + if (adapters_result == NO_ERROR) + { + for (auto* adapter = adapters; adapter != nullptr; adapter = adapter->Next) + { + if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK) + continue; + + auto* const unicast = adapter->FirstUnicastAddress; + if (!unicast) + continue; + char addr_str[INET_ADDRSTRLEN] = {}; + inet_ntop(AF_INET, &reinterpret_cast<sockaddr_in*>(unicast->Address.lpSockaddr)->sin_addr, + addr_str, sizeof(addr_str)); + result.emplace_back(WStringToUTF8(adapter->FriendlyName), addr_str); + } + } + else + { + WARN_LOG_FMT(NETPLAY, "GetAdaptersAddresses: {}", adapters_result); + } #elif defined(ANDROID) // Android has no getifaddrs for some stupid reason. If this // functionality ends up actually being used on Android, fix this. |
