Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
3.8 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //===========================================================================//
  6. #include "networkclient.h"
  7. #include "UDP_Socket.h"
  8. #include "NetChannel.h"
  9. #include "UDP_Process.h"
  10. #include <winsock.h>
  11. #include "tier1/bitbuf.h"
  12. #include "networksystem.h"
  13. #include "sm_protocol.h"
  14. //-----------------------------------------------------------------------------
  15. // Construction/Destruction
  16. //-----------------------------------------------------------------------------
  17. CNetworkClient::CNetworkClient() : m_bConnected( false )
  18. {
  19. m_pSocket = new CUDPSocket;
  20. }
  21. CNetworkClient::~CNetworkClient()
  22. {
  23. delete m_pSocket;
  24. }
  25. //-----------------------------------------------------------------------------
  26. // Init/Shutdown
  27. //-----------------------------------------------------------------------------
  28. bool CNetworkClient::Init( int nListenPort )
  29. {
  30. if ( !m_pSocket->Init( nListenPort ) )
  31. {
  32. Warning( "CNetworkClient: Unable to create socket!!!\n" );
  33. return false;
  34. }
  35. return true;
  36. }
  37. void CNetworkClient::Shutdown()
  38. {
  39. m_pSocket->Shutdown();
  40. }
  41. #define SPEW_MESSAGES
  42. #if defined( SPEW_MESSAGES )
  43. #define SM_SPEW_MESSAGE( code, remote ) \
  44. Warning( "Message: %s from '%s'\n", #code, remote );
  45. #else
  46. #define SM_SPEW_MESSAGE( code, remote )
  47. #endif
  48. // process a connectionless packet
  49. bool CNetworkClient::ProcessConnectionlessPacket( CNetPacket *packet )
  50. {
  51. int code = packet->m_Message.ReadByte();
  52. switch ( code )
  53. {
  54. case s2c_connect_accept:
  55. {
  56. SM_SPEW_MESSAGE( s2c_connect_accept, packet->m_From.ToString() );
  57. m_NetChan.Setup( false, &packet->m_From, m_pSocket, "client", this );
  58. m_bConnected = true;
  59. }
  60. break;
  61. default:
  62. {
  63. Warning( "CSmServer::ProcessConnectionlessPacket: Unknown code '%i' from '%s'\n",
  64. code, packet->m_From.ToString() );
  65. }
  66. break;
  67. }
  68. return true;
  69. }
  70. INetChannel *CNetworkClient::FindNetChannel( const netadr_t& from )
  71. {
  72. if ( from.CompareAdr( m_NetChan.GetRemoteAddress() ) )
  73. return &m_NetChan;
  74. return NULL;
  75. }
  76. void CNetworkClient::ReadPackets( void )
  77. {
  78. UDP_ProcessSocket( m_pSocket, this, this );
  79. }
  80. void CNetworkClient::SendUpdate()
  81. {
  82. if ( m_bConnected )
  83. {
  84. m_NetChan.SendDatagram( NULL );
  85. }
  86. }
  87. void CNetworkClient::Disconnect()
  88. {
  89. if ( !m_bConnected )
  90. return;
  91. byte data[ 512 ];
  92. bf_write buf( "CNetworkClient::Connect", data, sizeof( data ) );
  93. WriteSystemNetworkMessage( buf, net_disconnect );
  94. buf.WriteString( "client disconnected" );
  95. m_NetChan.SendDatagram( &buf );
  96. m_NetChan.SendDatagram( &buf );
  97. m_NetChan.SendDatagram( &buf );
  98. }
  99. bool CNetworkClient::Connect( char const *server, int port /*=SM_SERVER_PORT*/ )
  100. {
  101. byte data[ 512 ];
  102. bf_write buf( "CNetworkClient::Connect", data, sizeof( data ) );
  103. buf.WriteLong( -1 );
  104. buf.WriteByte( c2s_connect );
  105. netadr_t remote;
  106. remote.type = NA_IP;
  107. remote.port = htons( (unsigned short)port );
  108. // Resolve remote name
  109. sockaddr sa;
  110. if ( !Q_stricmp( server, "localhost" ) )
  111. {
  112. remote.ip[ 0 ] = 127;
  113. remote.ip[ 1 ] = 0;
  114. remote.ip[ 2 ] = 0;
  115. remote.ip[ 3 ] = 1;
  116. }
  117. else
  118. {
  119. if ( !g_pNetworkSystemImp->StringToSockaddr( server, &sa ) )
  120. {
  121. Msg( "Unable to resolve '%s'\n", server );
  122. return false;
  123. }
  124. remote.SetFromSockadr( &sa );
  125. }
  126. m_NetChan.SetConnectionState( CONNECTION_STATE_CONNECTING );
  127. return m_pSocket->SendTo( remote, buf.GetData(), buf.GetNumBytesWritten() );
  128. }
  129. void CNetworkClient::OnConnectionClosing( INetChannel *channel, char const *reason )
  130. {
  131. Warning( "OnConnectionClosing '%s'\n", reason );
  132. if ( channel == &m_NetChan )
  133. {
  134. m_NetChan.Shutdown( "received disconnect\n" );
  135. m_bConnected = false;
  136. }
  137. }
  138. void CNetworkClient::OnConnectionStarted( INetChannel *channel )
  139. {
  140. Warning( "OnConnectionStarted\n" );
  141. }
  142. void CNetworkClient::OnPacketStarted( int inseq, int outseq )
  143. {
  144. }
  145. void CNetworkClient::OnPacketFinished()
  146. {
  147. }