diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /networksystem/networkclient.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'networksystem/networkclient.cpp')
| -rw-r--r-- | networksystem/networkclient.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/networksystem/networkclient.cpp b/networksystem/networkclient.cpp new file mode 100644 index 0000000..fdd8b04 --- /dev/null +++ b/networksystem/networkclient.cpp @@ -0,0 +1,178 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#include "networkclient.h" +#include "UDP_Socket.h" +#include "NetChannel.h" +#include "UDP_Process.h" +#include <winsock.h> +#include "tier1/bitbuf.h" +#include "networksystem.h" +#include "sm_protocol.h" + + +//----------------------------------------------------------------------------- +// Construction/Destruction +//----------------------------------------------------------------------------- +CNetworkClient::CNetworkClient() : m_bConnected( false ) +{ + m_pSocket = new CUDPSocket; +} + +CNetworkClient::~CNetworkClient() +{ + delete m_pSocket; +} + + +//----------------------------------------------------------------------------- +// Init/Shutdown +//----------------------------------------------------------------------------- +bool CNetworkClient::Init( int nListenPort ) +{ + if ( !m_pSocket->Init( nListenPort ) ) + { + Warning( "CNetworkClient: Unable to create socket!!!\n" ); + return false; + } + return true; +} + +void CNetworkClient::Shutdown() +{ + m_pSocket->Shutdown(); +} + +#define SPEW_MESSAGES + +#if defined( SPEW_MESSAGES ) +#define SM_SPEW_MESSAGE( code, remote ) \ + Warning( "Message: %s from '%s'\n", #code, remote ); +#else +#define SM_SPEW_MESSAGE( code, remote ) +#endif + +// process a connectionless packet +bool CNetworkClient::ProcessConnectionlessPacket( CNetPacket *packet ) +{ + int code = packet->m_Message.ReadByte(); + switch ( code ) + { + case s2c_connect_accept: + { + SM_SPEW_MESSAGE( s2c_connect_accept, packet->m_From.ToString() ); + + m_NetChan.Setup( false, &packet->m_From, m_pSocket, "client", this ); + m_bConnected = true; + } + break; + default: + { + Warning( "CSmServer::ProcessConnectionlessPacket: Unknown code '%i' from '%s'\n", + code, packet->m_From.ToString() ); + } + break; + } + + return true; +} + +INetChannel *CNetworkClient::FindNetChannel( const netadr_t& from ) +{ + if ( from.CompareAdr( m_NetChan.GetRemoteAddress() ) ) + return &m_NetChan; + return NULL; +} + +void CNetworkClient::ReadPackets( void ) +{ + UDP_ProcessSocket( m_pSocket, this, this ); +} + +void CNetworkClient::SendUpdate() +{ + if ( m_bConnected ) + { + m_NetChan.SendDatagram( NULL ); + } +} + + +void CNetworkClient::Disconnect() +{ + if ( !m_bConnected ) + return; + + byte data[ 512 ]; + bf_write buf( "CNetworkClient::Connect", data, sizeof( data ) ); + + WriteSystemNetworkMessage( buf, net_disconnect ); + buf.WriteString( "client disconnected" ); + + m_NetChan.SendDatagram( &buf ); + m_NetChan.SendDatagram( &buf ); + m_NetChan.SendDatagram( &buf ); +} + +bool CNetworkClient::Connect( char const *server, int port /*=SM_SERVER_PORT*/ ) +{ + byte data[ 512 ]; + bf_write buf( "CNetworkClient::Connect", data, sizeof( data ) ); + + buf.WriteLong( -1 ); + buf.WriteByte( c2s_connect ); + + netadr_t remote; + remote.type = NA_IP; + remote.port = htons( (unsigned short)port ); + + // Resolve remote name + sockaddr sa; + if ( !Q_stricmp( server, "localhost" ) ) + { + remote.ip[ 0 ] = 127; + remote.ip[ 1 ] = 0; + remote.ip[ 2 ] = 0; + remote.ip[ 3 ] = 1; + } + else + { + if ( !g_pNetworkSystemImp->StringToSockaddr( server, &sa ) ) + { + Msg( "Unable to resolve '%s'\n", server ); + return false; + } + + remote.SetFromSockadr( &sa ); + } + + m_NetChan.SetConnectionState( CONNECTION_STATE_CONNECTING ); + + return m_pSocket->SendTo( remote, buf.GetData(), buf.GetNumBytesWritten() ); +} + +void CNetworkClient::OnConnectionClosing( INetChannel *channel, char const *reason ) +{ + Warning( "OnConnectionClosing '%s'\n", reason ); + if ( channel == &m_NetChan ) + { + m_NetChan.Shutdown( "received disconnect\n" ); + m_bConnected = false; + } +} + +void CNetworkClient::OnConnectionStarted( INetChannel *channel ) +{ + Warning( "OnConnectionStarted\n" ); +} + +void CNetworkClient::OnPacketStarted( int inseq, int outseq ) +{ +} + +void CNetworkClient::OnPacketFinished() +{ +}
\ No newline at end of file |