summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2025-01-24 14:40:25 -0600
committerGitHub <noreply@github.com>2025-01-24 14:40:25 -0600
commit799b9d409290f97ac46103facbc09ba280d465e3 (patch)
tree13fa96d81748ca096dc5890131ad448ecf3b4bc7 /Source
parentd0b7c96fdb7ea50d55bb3cf581e5820d7b27b7e1 (diff)
parent3b856530031aff08567f0c2373f61b6324c327c4 (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.cpp30
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.