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/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..317614243 --- /dev/null +++ b/mp/src/game/shared/sdk/p2p.cpp @@ -0,0 +1,128 @@ +#include "cbase.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), + m_nTimeoutSec(nTimeoutSec), + m_bAllowUseOfPacketRelay(bAllowUseOfPacketRelay) +{ + m_socketP2P = steamapicontext->SteamNetworking()->CreateP2PConnectionSocket(m_steamIDTarget, m_nVirtualPort, m_nTimeoutSec, m_bAllowUseOfPacketRelay); + m_sockaddrInRecipient = CreateSockaddrIn("127.0.0.1", 27015); +} + +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)) + { + // 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 (true) + { + while (!steamapicontext->SteamNetworking()->IsP2PPacketAvailable(&length)) ; + // Read from m_socketP2P + unsigned char *data = new unsigned char[length]; + uint32 actualLength; + CSteamID 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); + } +} + +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 new file mode 100644 index 000000000..a4db5b567 --- /dev/null +++ b/mp/src/game/shared/sdk/p2p.h @@ -0,0 +1,30 @@ +#ifndef P2P_H +#define P2P_H +#ifdef _WIN32 +#pragma once +#endif + +#include "steam/steam_api.h" +#include "blockingudpsocket.h" + +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; + struct sockaddr_in* m_sockaddrInRecipient; +}; + +#endif