Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mp/src/creategameprojects.bat
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions mp/src/game/client/client_base.vpc
Original file line number Diff line number Diff line change
Expand Up @@ -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" \
Expand Down Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions mp/src/game/client/client_da.vpc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 2 additions & 0 deletions mp/src/game/server/server_base.vpc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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" \
Expand Down
1 change: 1 addition & 0 deletions mp/src/game/server/server_da.vpc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
128 changes: 128 additions & 0 deletions mp/src/game/shared/sdk/p2p.cpp
Original file line number Diff line number Diff line change
@@ -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 <winsock.h>
#elif POSIX
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#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();
}
30 changes: 30 additions & 0 deletions mp/src/game/shared/sdk/p2p.h
Original file line number Diff line number Diff line change
@@ -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