From 69c8e1e198a4db6fee0be846de0e70fb220c31a1 Mon Sep 17 00:00:00 2001 From: Nomads_Reach <144523850+NomadsReach@users.noreply.github.com> Date: Sun, 16 Aug 2026 00:28:42 -0400 Subject: [PATCH] Test GNS remote endpoint query --- .../test_co_gns_server_endpoint.cpp | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 server/native_transport/test_co_gns_server_endpoint.cpp diff --git a/server/native_transport/test_co_gns_server_endpoint.cpp b/server/native_transport/test_co_gns_server_endpoint.cpp new file mode 100644 index 0000000..c38ebfb --- /dev/null +++ b/server/native_transport/test_co_gns_server_endpoint.cpp @@ -0,0 +1,83 @@ +#include "co_gns_server_bridge.h" + +#include + +#include +#include +#include +#include +#include + +namespace +{ + using namespace std::chrono_literals; + + HSteamNetConnection g_clientConnection = k_HSteamNetConnection_Invalid; + bool g_clientConnected = false; + + void ClientConnectionStatusChanged(SteamNetConnectionStatusChangedCallback_t* info) + { + if (info == nullptr || info->m_hConn != g_clientConnection) { + return; + } + if (info->m_info.m_eState == k_ESteamNetworkingConnectionState_Connected) { + g_clientConnected = true; + } + } +} + +int main() +{ + co_gns_server_handle server = nullptr; + std::array error{}; + assert(co_gns_server_create("127.0.0.1", 0, &server, error.data(), error.size()) == 1); + assert(server != nullptr); + const auto serverPort = co_gns_server_local_port(server); + assert(serverPort != 0); + + auto* networking = SteamNetworkingSockets(); + assert(networking != nullptr); + SteamNetworkingIPAddr serverAddress{}; + serverAddress.Clear(); + serverAddress.SetIPv4(0x7F000001U, serverPort); + SteamNetworkingConfigValue_t option{}; + option.SetPtr( + k_ESteamNetworkingConfig_Callback_ConnectionStatusChanged, + reinterpret_cast(+ClientConnectionStatusChanged)); + g_clientConnection = networking->ConnectByIPAddress(serverAddress, 1, &option); + assert(g_clientConnection != k_HSteamNetConnection_Invalid); + + std::uint32_t serverConnectionId = 0; + const auto deadline = std::chrono::steady_clock::now() + 3s; + while (std::chrono::steady_clock::now() < deadline && (serverConnectionId == 0 || !g_clientConnected)) { + co_gns_event event{}; + std::array payload{}; + const auto pollResult = co_gns_server_poll( + server, + &event, + payload.data(), + static_cast(payload.size())); + assert(pollResult >= 0); + if (pollResult == 1 && event.type == CO_GNS_EVENT_CONNECTED) { + serverConnectionId = event.connection_id; + } + std::this_thread::sleep_for(2ms); + } + + assert(g_clientConnected); + assert(serverConnectionId != 0); + std::uint32_t remoteIpv4 = 0; + std::uint16_t remotePort = 0; + assert(co_gns_server_remote_ipv4(server, serverConnectionId, &remoteIpv4, &remotePort) == 1); + assert(remoteIpv4 == 0x7F000001U); + assert(remotePort != 0); + + std::uint32_t missingIpv4 = 0; + std::uint16_t missingPort = 0; + assert(co_gns_server_remote_ipv4(server, serverConnectionId + 100000U, &missingIpv4, &missingPort) == 0); + + networking->CloseConnection(g_clientConnection, 0, nullptr, false); + g_clientConnection = k_HSteamNetConnection_Invalid; + co_gns_server_destroy(server); + return 0; +}