| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | // This file is public domain, in case it's useful to anyone. -comex
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #include <enet/enet.h>
 | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | #include <functional>
 | 
					
						
							|  |  |  | #include <list>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2015-03-10 01:47:29 +01:00
										 |  |  | #include <random>
 | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | #include "Common/Common.h"
 | 
					
						
							|  |  |  | #include "Common/Thread.h"
 | 
					
						
							|  |  |  | #include "Common/TraversalProto.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TraversalClientClient | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   virtual ~TraversalClientClient(){}; | 
					
						
							|  |  |  |   virtual void OnTraversalStateChanged() = 0; | 
					
						
							|  |  |  |   virtual void OnConnectReady(ENetAddress addr) = 0; | 
					
						
							|  |  |  |   virtual void OnConnectFailed(u8 reason) = 0; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TraversalClient | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   enum State | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     Connecting, | 
					
						
							|  |  |  |     Connected, | 
					
						
							|  |  |  |     Failure | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   enum FailureReason | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     BadHost = 0x300, | 
					
						
							|  |  |  |     VersionTooOld, | 
					
						
							|  |  |  |     ServerForgotAboutUs, | 
					
						
							|  |  |  |     SocketSendError, | 
					
						
							|  |  |  |     ResendTimeout, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   TraversalClient(ENetHost* netHost, const std::string& server, const u16 port); | 
					
						
							|  |  |  |   ~TraversalClient(); | 
					
						
							|  |  |  |   void Reset(); | 
					
						
							|  |  |  |   void ConnectToClient(const std::string& host); | 
					
						
							|  |  |  |   void ReconnectToServer(); | 
					
						
							|  |  |  |   void Update(); | 
					
						
							|  |  |  |   // called from NetHost
 | 
					
						
							|  |  |  |   bool TestPacket(u8* data, size_t size, ENetAddress* from); | 
					
						
							|  |  |  |   void HandleResends(); | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   ENetHost* m_NetHost; | 
					
						
							|  |  |  |   TraversalClientClient* m_Client; | 
					
						
							|  |  |  |   TraversalHostId m_HostId; | 
					
						
							|  |  |  |   State m_State; | 
					
						
							|  |  |  |   int m_FailureReason; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   struct OutgoingTraversalPacketInfo | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     TraversalPacket packet; | 
					
						
							|  |  |  |     int tries; | 
					
						
							|  |  |  |     enet_uint32 sendTime; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   void HandleServerPacket(TraversalPacket* packet); | 
					
						
							|  |  |  |   void ResendPacket(OutgoingTraversalPacketInfo* info); | 
					
						
							|  |  |  |   TraversalRequestId SendTraversalPacket(const TraversalPacket& packet); | 
					
						
							|  |  |  |   void OnFailure(FailureReason reason); | 
					
						
							|  |  |  |   void HandlePing(); | 
					
						
							|  |  |  |   static int ENET_CALLBACK InterceptCallback(ENetHost* host, ENetEvent* event); | 
					
						
							|  |  |  |   TraversalRequestId m_ConnectRequestId; | 
					
						
							|  |  |  |   bool m_PendingConnect; | 
					
						
							|  |  |  |   std::list<OutgoingTraversalPacketInfo> m_OutgoingTraversalPackets; | 
					
						
							|  |  |  |   ENetAddress m_ServerAddress; | 
					
						
							|  |  |  |   std::string m_Server; | 
					
						
							|  |  |  |   u16 m_port; | 
					
						
							|  |  |  |   enet_uint32 m_PingTime; | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | extern std::unique_ptr<TraversalClient> g_TraversalClient; | 
					
						
							|  |  |  | // the NetHost connected to the TraversalClient.
 | 
					
						
							|  |  |  | extern std::unique_ptr<ENetHost> g_MainNetHost; | 
					
						
							|  |  |  | // Create g_TraversalClient and g_MainNetHost if necessary.
 | 
					
						
							| 
									
										
										
										
											2015-09-20 20:08:37 +09:00
										 |  |  | bool EnsureTraversalClient(const std::string& server, u16 server_port, u16 listen_port = 0); | 
					
						
							| 
									
										
										
										
											2015-02-02 01:56:53 -08:00
										 |  |  | void ReleaseTraversalClient(); |