MasterServerClient.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //
  2. // Communication with an atomic master server
  3. // Handles NAT Punch-through for clients
  4. //
  5. #pragma once
  6. #include <ThirdParty/kNet/include/kNet.h>
  7. #include "../Core/Object.h"
  8. namespace Atomic
  9. {
  10. class Scene;
  11. enum ConnectToMasterState
  12. {
  13. MASTER_NOT_CONNECTED = 0,
  14. MASTER_CONNECTING_UDP,
  15. MASTER_CONNECTING_TCP,
  16. MASTER_CONNECTED,
  17. MASTER_CONNECTION_FAILED
  18. };
  19. enum ClientConnectToGameServerState
  20. {
  21. GAME_NOT_CONNECTED = 0,
  22. GAME_CONNECTING_INTERNAL_IP,
  23. GAME_VERIFYING_SERVER,
  24. GAME_CONNECTING_EXTERNAL_IP,
  25. GAME_CONNECTED,
  26. GAME_CONNECTION_FAILED
  27. };
  28. struct MasterServer
  29. {
  30. String address;
  31. unsigned short port;
  32. bool isRegisteringServer;
  33. String serverName;
  34. };
  35. /// Game server info used by a client when connecting
  36. struct RemoteGameServer
  37. {
  38. /// Game server id
  39. String serverId;
  40. String internalAddress;
  41. unsigned short internalPort;
  42. String externalAddress;
  43. unsigned short externalPort;
  44. Scene* clientScene;
  45. };
  46. /// Client for master server, see Script/AtomicMasterServer for example master server implementation
  47. class ATOMIC_API MasterServerClient : public Object
  48. {
  49. ATOMIC_OBJECT(MasterServerClient, Object);
  50. public:
  51. /// Construct.
  52. MasterServerClient(Context* context);
  53. /// Destruct.
  54. ~MasterServerClient();
  55. void ConnectToMaster(const String& address, unsigned short port);
  56. void DisconnectFromMaster();
  57. void RequestServerListFromMaster();
  58. void ConnectToServerViaMaster(const String& serverId,
  59. const String& internalAddress, unsigned short internalPort,
  60. const String& externalAddress, unsigned short externalPort,
  61. Scene* scene);
  62. void ConnectToMasterAndRegister(const String& address, unsigned short port, const String& serverName);
  63. /// Convenience method to start server and register it with the master server
  64. bool StartServerAndRegisterWithMaster(unsigned short serverPort, const String &masterAddress,
  65. unsigned short masterPort, const String &serverName);
  66. private:
  67. void HandleBeginFrame(StringHash eventType, VariantMap& eventData);
  68. void SendMessageToMasterServer(const String& message);
  69. void HandleMasterServerMessage(const String& msg);
  70. void RegisterServerWithMaster(const String& serverName);
  71. /// Process messages
  72. void Update(float timeStep);
  73. float udpConnectionSecondsRemaining_;
  74. float udpSecondsTillRetry_;
  75. // Communication with Master Server
  76. bool readingMasterMessageLength;
  77. uint32_t bytesRemainingInMasterServerMessage_;
  78. String masterMessageLengthStr;
  79. String masterMessageStr;
  80. kNet::Socket* masterUDPConnection_;
  81. kNet::Socket* masterTCPConnection_;
  82. String masterServerConnectionId_;
  83. void SetConnectToGameServerState(ClientConnectToGameServerState state);
  84. void SetConnectToMasterState(ConnectToMasterState state);
  85. void ConnectToMasterUpdate(float dt);
  86. void ConnectToGameServerUpdate(float dt);
  87. float timeBetweenClientPunchThroughAttempts_;
  88. float timeTillNextPunchThroughAttempt_;
  89. float timeBetweenClientConnectAttempts_;
  90. float timeTillNextClientConnectAttempt_;
  91. HashMap<String, kNet::Socket*> clientIdToPunchThroughSocketMap_;
  92. kNet::Socket* clientToServerSocket_;
  93. ConnectToMasterState connectToMasterState_;
  94. ClientConnectToGameServerState clientConnectToGameServerState_;
  95. RemoteGameServer remoteGameServerInfo_;
  96. float connectToGameServerSecondsRemaining_;
  97. MasterServer masterServerInfo_;
  98. void CheckForMessageFromMaster();
  99. void CheckForNatPunchThroughRequests(float dt);
  100. };
  101. }