From e73aa06e5f1acf2049cfe47797905e8b9d0a57e1 Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Fri, 11 Jan 2019 07:27:25 +0100 Subject: [PATCH 1/2] p2p WIP --- mp/src/game/client/client_base.vpc | 2 + mp/src/game/client/client_da.vpc | 1 + mp/src/game/server/server_base.vpc | 2 + mp/src/game/server/server_da.vpc | 1 + mp/src/game/shared/sdk/p2p.cpp | 75 ++++++++++++++++++++++++++++++ mp/src/game/shared/sdk/p2p.h | 55 ++++++++++++++++++++++ 6 files changed, 136 insertions(+) create mode 100644 mp/src/game/shared/sdk/p2p.cpp create mode 100644 mp/src/game/shared/sdk/p2p.h diff --git a/mp/src/game/client/client_base.vpc b/mp/src/game/client/client_base.vpc index 52dceb7e3..01743345d 100644 --- a/mp/src/game/client/client_base.vpc +++ b/mp/src/game/client/client_base.vpc @@ -518,6 +518,7 @@ $Project // Files not using precompiled header cbase.h $File "$SRCDIR\public\bone_setup.cpp" \ + "$SRCDIR\public\blockingudpsocket.cpp" \ "$SRCDIR\public\posedebugger.cpp" \ "$SRCDIR\public\client_class.cpp" \ "$SRCDIR\common\compiledcaptionswap.cpp" \ @@ -887,6 +888,7 @@ $Project $File "$SRCDIR\public\bitvec.h" $File "$SRCDIR\public\bone_accessor.h" $File "$SRCDIR\public\bone_setup.h" + $File "$SRCDIR\public\blockingudpsocket.h" $File "$SRCDIR\public\bspfile.h" $File "$SRCDIR\public\bspflags.h" $File "$SRCDIR\public\bsptreedata.h" diff --git a/mp/src/game/client/client_da.vpc b/mp/src/game/client/client_da.vpc index 50669a342..14b4e123c 100644 --- a/mp/src/game/client/client_da.vpc +++ b/mp/src/game/client/client_da.vpc @@ -143,6 +143,7 @@ $Project "Client (DA)" $File "$SRCDIR/game/shared/sdk/sdk_shareddefs.cpp" $File "$SRCDIR/game/shared/sdk/sdk_usermessages.cpp" $File "sdk/da_viewback.cpp" [$VIEWBACK] + $File "$SRCDIR/game/shared/sdk/p2p.cpp" } $Folder "Source Files" diff --git a/mp/src/game/server/server_base.vpc b/mp/src/game/server/server_base.vpc index f1c3c8356..2e680d398 100644 --- a/mp/src/game/server/server_base.vpc +++ b/mp/src/game/server/server_base.vpc @@ -259,6 +259,7 @@ $Project $File "bitstring.h" $File "bmodels.cpp" $File "$SRCDIR\public\bone_setup.h" + $File "$SRCDIR\public\blockingudpsocket.h" $File "buttons.cpp" $File "buttons.h" $File "cbase.cpp" @@ -668,6 +669,7 @@ $Project // Not using precompiled header cbase.h $File "$SRCDIR\public\bone_setup.cpp" \ + "$SRCDIR\public\blockingudpsocket.cpp" \ "$SRCDIR\public\collisionutils.cpp" \ "$SRCDIR\public\dt_send.cpp" \ "$SRCDIR\public\dt_utlvector_common.cpp" \ diff --git a/mp/src/game/server/server_da.vpc b/mp/src/game/server/server_da.vpc index 03e7c255d..1573314d2 100644 --- a/mp/src/game/server/server_da.vpc +++ b/mp/src/game/server/server_da.vpc @@ -114,6 +114,7 @@ $Project "Server (DA)" $File "sdk/sdk_vehicle_jeep.cpp" $File "sdk/te_firebullets.cpp" $File "sdk/trigger_kill.cpp" + $File "$SRCDIR/game/shared/sdk/p2p.cpp" } $Folder "Source Files" diff --git a/mp/src/game/shared/sdk/p2p.cpp b/mp/src/game/shared/sdk/p2p.cpp new file mode 100644 index 000000000..c37327722 --- /dev/null +++ b/mp/src/game/shared/sdk/p2p.cpp @@ -0,0 +1,75 @@ +#include "cbase.h" + +#include "p2p.h" + +#include "vprof.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +P2PTunnel::P2PTunnel(CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay) : + m_steamIDTarget(steamIDTarget), + m_nVirtualPort(nVirtualPort), + m_nTimeoutSec(nTimeoutSec), + m_bAllowUseOfPacketRelay(bAllowUseOfPacketRelay) +{ + m_socketP2P = steamapicontext->SteamNetworking()->CreateP2PConnectionSocket(m_steamIDTarget, m_nVirtualPort, m_nTimeoutSec, m_bAllowUseOfPacketRelay); + + memset(&m_sockaddrInRecipient, 0, sizeof(m_sockaddrInRecipient)); + m_sockaddrInRecipient.sin_family = AF_INET; + m_sockaddrInRecipient.sin_port = htons(27015); + m_sockaddrInRecipient.sin_addr.s_addr = inet_addr("127.0.0.1"); +} + +P2PTunnel::~P2PTunnel() { + steamapicontext->SteamNetworking()->DestroySocket(m_socketP2P, true); +} + +void P2PTunnel::StartThreads() { + CreateSimpleThread([] (void* params) -> unsigned int { + P2PTunnel* tunnel = (P2PTunnel*)params; + tunnel->Run1(); + delete tunnel; + + return 0; + }, this); + + CreateSimpleThread([] (void* params) -> unsigned int { + P2PTunnel* tunnel = (P2PTunnel*)params; + tunnel->Run2(); + delete tunnel; + + return 0; + }, this); +} + +void P2PTunnel::Run1() { + while (m_socketNet.WaitForMessage(FP_INFINITE)) // TODO block until packet arrives + { + // Read from m_socketNet + unsigned char data[4096]; + sockaddr_in packet_from; + uint32 length = m_socketNet.ReceiveSocketMessage(&packet_from, &data[0], sizeof(data)); + + // Write to m_socketP2P + steamapicontext->SteamNetworking()->SendP2PPacket(m_steamIDTarget, data, length, k_EP2PSendUnreliable); + } +} +void P2PTunnel::Run2() { + uint32 length; + + while (!steamapicontext->SteamNetworking()->IsP2PPacketAvailable(&length)) + { + // Read from m_socketP2P + unsigned char *data = new unsigned char[length]; + uint32 actualLength; + CSteamID actualSteamID; + + steamapicontext->SteamNetworking()->ReadP2PPacket(data, length, &actualLength, &actualSteamID); + Assert(length == actualLength); + Assert(m_steamIDTarget == actualSteamID); + + // Write to m_socketNet + m_socketNet.SendSocketMessage(m_sockaddrInRecipient, data, actualLength); + } +} diff --git a/mp/src/game/shared/sdk/p2p.h b/mp/src/game/shared/sdk/p2p.h new file mode 100644 index 000000000..c69ed3dcb --- /dev/null +++ b/mp/src/game/shared/sdk/p2p.h @@ -0,0 +1,55 @@ +#ifndef P2P_H +#define P2P_H +#ifdef _WIN32 +#pragma once +#endif + +#include "steam/steam_api.h" +#include "blockingudpsocket.h" + +#if defined(_WIN32) && !defined(_X360) +#define WIN32_LEAN_AND_MEAN +#undef INVALID_HANDLE_VALUE +#undef GetCommandLine +#undef ReadConsoleInput +#undef RegCreateKey +#undef RegCreateKeyEx +#undef RegOpenKey +#undef RegOpenKeyEx +#undef RegQueryValue +#undef RegQueryValueEx +#undef RegSetValue +#undef RegSetValueEx +#include +#elif POSIX +//#define INVALID_SOCKET -1 +//#define SOCKET_ERROR -1 +#include +#include +#include +#include +//#define closesocket close +#endif + + +class P2PTunnel +{ +public: + P2PTunnel(CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay); + ~P2PTunnel(); + + void StartThreads(); + void Run1(); + void Run2(); + +private: + CSteamID m_steamIDTarget; + int m_nVirtualPort; + int m_nTimeoutSec; + bool m_bAllowUseOfPacketRelay; + SNetSocket_t m_socketP2P; + CBlockingUDPSocket m_socketNet; + sockaddr_in m_sockaddrInRecipient; +}; + +#endif From fe39c13349f35a9ae33d91d60e2440e5550d45fe Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Sat, 19 Jan 2019 12:10:13 +0100 Subject: [PATCH 2/2] WIP2 --- mp/src/creategameprojects.bat | 2 +- mp/src/game/shared/sdk/p2p.cpp | 73 +++++++++++++++++++++++++++++----- mp/src/game/shared/sdk/p2p.h | 27 +------------ 3 files changed, 65 insertions(+), 37 deletions(-) diff --git a/mp/src/creategameprojects.bat b/mp/src/creategameprojects.bat index ba8ef8677..eb2eba555 100755 --- a/mp/src/creategameprojects.bat +++ b/mp/src/creategameprojects.bat @@ -1,6 +1,6 @@ @echo off pushd %~dp0 -sed -ri '/PLACEHOLDER_COMPILER_ARGS/ s/^.*$/git rev-parse HEAD/e; T; s/^.*$/$PreprocessorDefinitions "$BASE;DA_GIT_VERSION=\0"/' game/client/client_da.vpc game/server/server_da.vpc +::sed -ri '/PLACEHOLDER_COMPILER_ARGS/ s/^.*$/git rev-parse HEAD/e; T; s/^.*$/$PreprocessorDefinitions "$BASE;DA_GIT_VERSION=\0"/' game/client/client_da.vpc game/server/server_da.vpc devtools\bin\vpc.exe /da +game /mksln DoubleAction.sln /2013 popd pause diff --git a/mp/src/game/shared/sdk/p2p.cpp b/mp/src/game/shared/sdk/p2p.cpp index c37327722..317614243 100644 --- a/mp/src/game/shared/sdk/p2p.cpp +++ b/mp/src/game/shared/sdk/p2p.cpp @@ -1,12 +1,47 @@ #include "cbase.h" -#include "p2p.h" +#if defined(_WIN32) && !defined(_X360) +#define WIN32_LEAN_AND_MEAN +#undef INVALID_HANDLE_VALUE +#undef GetCommandLine +#undef ReadConsoleInput +#undef RegCreateKey +#undef RegCreateKeyEx +#undef RegOpenKey +#undef RegOpenKeyEx +#undef RegQueryValue +#undef RegQueryValueEx +#undef RegSetValue +#undef RegSetValueEx +#include +#elif POSIX +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 +#include +#include +#include +#include +#define closesocket close +#endif +#include "p2p.h" #include "vprof.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" +sockaddr_in* CreateSockaddrIn(const char* addr, unsigned short port) +{ + sockaddr_in* ret = new sockaddr_in{}; + + ret->sin_family = AF_INET; + ret->sin_port = htons(port); + ret->sin_addr.s_addr = inet_addr(addr); + return ret; +} + + + P2PTunnel::P2PTunnel(CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, bool bAllowUseOfPacketRelay) : m_steamIDTarget(steamIDTarget), m_nVirtualPort(nVirtualPort), @@ -14,11 +49,7 @@ P2PTunnel::P2PTunnel(CSteamID steamIDTarget, int nVirtualPort, int nTimeoutSec, m_bAllowUseOfPacketRelay(bAllowUseOfPacketRelay) { m_socketP2P = steamapicontext->SteamNetworking()->CreateP2PConnectionSocket(m_steamIDTarget, m_nVirtualPort, m_nTimeoutSec, m_bAllowUseOfPacketRelay); - - memset(&m_sockaddrInRecipient, 0, sizeof(m_sockaddrInRecipient)); - m_sockaddrInRecipient.sin_family = AF_INET; - m_sockaddrInRecipient.sin_port = htons(27015); - m_sockaddrInRecipient.sin_addr.s_addr = inet_addr("127.0.0.1"); + m_sockaddrInRecipient = CreateSockaddrIn("127.0.0.1", 27015); } P2PTunnel::~P2PTunnel() { @@ -44,32 +75,54 @@ void P2PTunnel::StartThreads() { } void P2PTunnel::Run1() { - while (m_socketNet.WaitForMessage(FP_INFINITE)) // TODO block until packet arrives + while (m_socketNet.WaitForMessage(FP_INFINITE)) { // Read from m_socketNet unsigned char data[4096]; sockaddr_in packet_from; uint32 length = m_socketNet.ReceiveSocketMessage(&packet_from, &data[0], sizeof(data)); + // TODO: compare packet_from with *m_sockaddrInRecipient + // Write to m_socketP2P steamapicontext->SteamNetworking()->SendP2PPacket(m_steamIDTarget, data, length, k_EP2PSendUnreliable); } } + void P2PTunnel::Run2() { uint32 length; - while (!steamapicontext->SteamNetworking()->IsP2PPacketAvailable(&length)) + while (true) { + while (!steamapicontext->SteamNetworking()->IsP2PPacketAvailable(&length)) ; // Read from m_socketP2P unsigned char *data = new unsigned char[length]; uint32 actualLength; CSteamID actualSteamID; - steamapicontext->SteamNetworking()->ReadP2PPacket(data, length, &actualLength, &actualSteamID); + if (!steamapicontext->SteamNetworking()->ReadP2PPacket(data, length, &actualLength, &actualSteamID)) { + return; + } Assert(length == actualLength); Assert(m_steamIDTarget == actualSteamID); + if (m_steamIDTarget != actualSteamID) { + return; + } // Write to m_socketNet - m_socketNet.SendSocketMessage(m_sockaddrInRecipient, data, actualLength); + m_socketNet.SendSocketMessage(*m_sockaddrInRecipient, data, actualLength); } } + +CON_COMMAND(da_test_p2p, "") +{ + //da_test_p2p 76561197967388217 + uint64 steamID64; + sscanf(args[1], "%llu", &steamID64); + + CSteamID steamIDTarget(steamID64); + Msg("test %llu\n", steamIDTarget.ConvertToUint64()); + + P2PTunnel* tunnel = new P2PTunnel(steamIDTarget, 1234, 20, true); + tunnel->StartThreads(); +} diff --git a/mp/src/game/shared/sdk/p2p.h b/mp/src/game/shared/sdk/p2p.h index c69ed3dcb..a4db5b567 100644 --- a/mp/src/game/shared/sdk/p2p.h +++ b/mp/src/game/shared/sdk/p2p.h @@ -7,31 +7,6 @@ #include "steam/steam_api.h" #include "blockingudpsocket.h" -#if defined(_WIN32) && !defined(_X360) -#define WIN32_LEAN_AND_MEAN -#undef INVALID_HANDLE_VALUE -#undef GetCommandLine -#undef ReadConsoleInput -#undef RegCreateKey -#undef RegCreateKeyEx -#undef RegOpenKey -#undef RegOpenKeyEx -#undef RegQueryValue -#undef RegQueryValueEx -#undef RegSetValue -#undef RegSetValueEx -#include -#elif POSIX -//#define INVALID_SOCKET -1 -//#define SOCKET_ERROR -1 -#include -#include -#include -#include -//#define closesocket close -#endif - - class P2PTunnel { public: @@ -49,7 +24,7 @@ class P2PTunnel bool m_bAllowUseOfPacketRelay; SNetSocket_t m_socketP2P; CBlockingUDPSocket m_socketNet; - sockaddr_in m_sockaddrInRecipient; + struct sockaddr_in* m_sockaddrInRecipient; }; #endif