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.

224 lines
4.8 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //===========================================================================//
  6. #include "networkserver.h"
  7. #include "networksystem.h"
  8. #include "icvar.h"
  9. #include "filesystem.h"
  10. #include "UDP_Socket.h"
  11. #include "sm_protocol.h"
  12. #include "NetChannel.h"
  13. #include "UDP_Process.h"
  14. #include <winsock.h>
  15. #include "networkclient.h"
  16. //-----------------------------------------------------------------------------
  17. //
  18. // Implementation of CPlayer
  19. //
  20. //-----------------------------------------------------------------------------
  21. CNetworkServer::CNetworkServer( )
  22. {
  23. m_pSocket = new CUDPSocket;
  24. }
  25. CNetworkServer::~CNetworkServer()
  26. {
  27. delete m_pSocket;
  28. }
  29. bool CNetworkServer::Init( int nServerPort )
  30. {
  31. if ( !m_pSocket->Init( nServerPort ) )
  32. {
  33. Warning( "CNetworkServer: Unable to create socket!!!\n" );
  34. return false;
  35. }
  36. return true;
  37. }
  38. void CNetworkServer::Shutdown()
  39. {
  40. m_pSocket->Shutdown();
  41. }
  42. CNetChannel *CNetworkServer::FindNetChannel( const netadr_t& from )
  43. {
  44. CPlayer *pl = FindPlayerByAddress( from );
  45. if ( pl )
  46. return &pl->m_NetChan;
  47. return NULL;
  48. }
  49. CPlayer *CNetworkServer::FindPlayerByAddress( const netadr_t& adr )
  50. {
  51. int c = m_Players.Count();
  52. for ( int i = 0; i < c; ++i )
  53. {
  54. CPlayer *player = m_Players[ i ];
  55. if ( player->GetRemoteAddress().CompareAdr( adr ) )
  56. return player;
  57. }
  58. return NULL;
  59. }
  60. CPlayer *CNetworkServer::FindPlayerByNetChannel( INetChannel *chan )
  61. {
  62. int c = m_Players.Count();
  63. for ( int i = 0; i < c; ++i )
  64. {
  65. CPlayer *player = m_Players[ i ];
  66. if ( &player->m_NetChan == chan )
  67. return player;
  68. }
  69. return NULL;
  70. }
  71. #define SPEW_MESSAGES
  72. #if defined( SPEW_MESSAGES )
  73. #define SM_SPEW_MESSAGE( code, remote ) \
  74. Warning( "Message: %s from '%s'\n", #code, remote );
  75. #else
  76. #define SM_SPEW_MESSAGE( code, remote )
  77. #endif
  78. // process a connectionless packet
  79. bool CNetworkServer::ProcessConnectionlessPacket( CNetPacket *packet )
  80. {
  81. int code = packet->m_Message.ReadByte();
  82. switch ( code )
  83. {
  84. case c2s_connect:
  85. {
  86. SM_SPEW_MESSAGE( c2s_connect, packet->m_From.ToString() );
  87. CPlayer *pl = FindPlayerByAddress( packet->m_From );
  88. if ( pl )
  89. {
  90. Warning( "Player already exists for %s\n", packet->m_From.ToString() );
  91. }
  92. else
  93. {
  94. // Creates the connection
  95. pl = new CPlayer( this, packet->m_From );
  96. m_Players.AddToTail( pl );
  97. // Now send the conn accepted message
  98. AcceptConnection( packet->m_From );
  99. }
  100. }
  101. break;
  102. default:
  103. {
  104. Warning( "CNetworkServer::ProcessConnectionlessPacket: Unknown code '%i' from '%s'\n",
  105. code, packet->m_From.ToString() );
  106. }
  107. break;
  108. }
  109. return true;
  110. }
  111. void CNetworkServer::AcceptConnection( const netadr_t& remote )
  112. {
  113. byte data[ 512 ];
  114. bf_write buf( "CNetworkServer::AcceptConnection", data, sizeof( data ) );
  115. buf.WriteLong( -1 );
  116. buf.WriteByte( s2c_connect_accept );
  117. m_pSocket->SendTo( remote, buf.GetData(), buf.GetNumBytesWritten() );
  118. }
  119. void CNetworkServer::ReadPackets( void )
  120. {
  121. UDP_ProcessSocket( m_pSocket, this, this );
  122. int c = m_Players.Count();
  123. for ( int i = c - 1; i >= 0 ; --i )
  124. {
  125. if ( m_Players[ i ]->m_bMarkedForDeletion )
  126. {
  127. CPlayer *pl = m_Players[ i ];
  128. m_Players.Remove( i );
  129. delete pl;
  130. }
  131. }
  132. }
  133. void CNetworkServer::SendUpdates()
  134. {
  135. int c = m_Players.Count();
  136. for ( int i = 0; i < c; ++i )
  137. {
  138. m_Players[ i ]->SendUpdate();
  139. }
  140. }
  141. void CNetworkServer::OnConnectionStarted( INetChannel *pChannel )
  142. {
  143. // Create a network event
  144. NetworkConnectionEvent_t *pConnection = g_pNetworkSystemImp->CreateNetworkEvent< NetworkConnectionEvent_t >( );
  145. pConnection->m_nType = NETWORK_EVENT_CONNECTED;
  146. pConnection->m_pChannel = pChannel;
  147. }
  148. void CNetworkServer::OnConnectionClosing( INetChannel *pChannel, char const *reason )
  149. {
  150. Warning( "OnConnectionClosing '%s'\n", reason );
  151. CPlayer *pPlayer = FindPlayerByNetChannel( pChannel );
  152. if ( pPlayer )
  153. {
  154. pPlayer->Shutdown();
  155. }
  156. // Create a network event
  157. NetworkDisconnectionEvent_t *pDisconnection = g_pNetworkSystemImp->CreateNetworkEvent< NetworkDisconnectionEvent_t >( );
  158. pDisconnection->m_nType = NETWORK_EVENT_DISCONNECTED;
  159. pDisconnection->m_pChannel = pChannel;
  160. }
  161. void CNetworkServer::OnPacketStarted( int inseq, int outseq )
  162. {
  163. }
  164. void CNetworkServer::OnPacketFinished()
  165. {
  166. }
  167. //-----------------------------------------------------------------------------
  168. //
  169. // Implementation of CPlayer
  170. //
  171. //-----------------------------------------------------------------------------
  172. CPlayer::CPlayer( CNetworkServer *server, netadr_t& remote ) :
  173. m_bMarkedForDeletion( false )
  174. {
  175. m_NetChan.Setup( true, &remote, server->m_pSocket, "player", server );
  176. }
  177. void CPlayer::Shutdown()
  178. {
  179. m_bMarkedForDeletion = true;
  180. m_NetChan.Shutdown( "received disconnect\n" );
  181. }
  182. void CPlayer::SendUpdate()
  183. {
  184. if ( m_NetChan.CanSendPacket() )
  185. {
  186. m_NetChan.SendDatagram( NULL );
  187. }
  188. }