Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "NativeFeatureIncludes.h"
00009 #if _RAKNET_SUPPORT_Router2==1
00010
00011 #ifndef __ROUTER_2_PLUGIN_H
00012 #define __ROUTER_2_PLUGIN_H
00013
00014 class RakPeerInterface;
00015 #include "RakNetTypes.h"
00016 #include "PluginInterface2.h"
00017 #include "PacketPriority.h"
00018 #include "Export.h"
00019 #include "UDPForwarder.h"
00020 #include "MessageIdentifiers.h"
00021
00022 namespace RakNet
00023 {
00024
00025 struct Router2DebugInterface
00026 {
00027 virtual void ShowFailure(const char *message);
00028 virtual void ShowDiagnostic(const char *message);
00029 };
00030
00035
00039 class RAK_DLL_EXPORT Router2 : public PluginInterface2
00040 {
00041 public:
00042 Router2();
00043 virtual ~Router2();
00044
00063 void EstablishRouting(RakNetGUID endpointGuid);
00064
00067 void SetMaximumForwardingRequests(int max);
00068
00070 void SetDebugInterface(Router2DebugInterface *_debugInterface);
00071
00073 Router2DebugInterface *GetDebugInterface(void) const;
00074
00075
00076
00077
00078 virtual PluginReceiveResult OnReceive(Packet *packet);
00079 virtual void Update(void);
00080 virtual void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason );
00081 virtual void OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason);
00082 virtual void OnNewConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, bool isIncoming);
00083 virtual void OnRakPeerShutdown(void);
00084
00085
00086 enum Router2RequestStates
00087 {
00088 R2RS_REQUEST_STATE_QUERY_FORWARDING,
00089 REQUEST_STATE_REQUEST_FORWARDING,
00090 };
00091
00092 struct ConnectionRequestSystem
00093 {
00094 RakNetGUID guid;
00095 int pingToEndpoint;
00096 unsigned short usedForwardingEntries;
00097 };
00098
00099 struct ConnnectRequest
00100 {
00101 ConnnectRequest();
00102 ~ConnnectRequest();
00103
00104 DataStructures::List<ConnectionRequestSystem> connectionRequestSystems;
00105 Router2RequestStates requestState;
00106 RakNetTimeMS pingTimeout;
00107 RakNetGUID endpointGuid;
00108 RakNetGUID lastRequestedForwardingSystem;
00109 bool returnConnectionLostOnFailure;
00110 unsigned int GetGuidIndex(RakNetGUID guid);
00111 };
00112
00113 unsigned int GetConnectionRequestIndex(RakNetGUID endpointGuid);
00114
00115 struct MiniPunchRequest
00116 {
00117 RakNetGUID endpointGuid;
00118 SystemAddress endpointAddress;
00119 bool gotReplyFromEndpoint;
00120 RakNetGUID sourceGuid;
00121 SystemAddress sourceAddress;
00122 bool gotReplyFromSource;
00123 RakNetTimeMS timeout;
00124 RakNetTimeMS nextAction;
00125 unsigned short srcToDestPort;
00126 unsigned short destToSourcePort;
00127 SOCKET srcToDestSocket;
00128 SOCKET destToSourceSocket;
00129 };
00130
00131 struct ForwardedConnection
00132 {
00133 RakNetGUID endpointGuid;
00134 RakNetGUID intermediaryGuid;
00135 SystemAddress intermediaryAddress;
00136 bool returnConnectionLostOnFailure;
00137 };
00138
00139 protected:
00140
00141 bool UpdateForwarding(unsigned int connectionRequestIndex);
00142 void RemoveConnectionRequest(unsigned int connectionRequestIndex);
00143 void RequestForwarding(unsigned int connectionRequestIndex);
00144 void OnQueryForwarding(Packet *packet);
00145 void OnQueryForwardingReply(Packet *packet);
00146 void OnRequestForwarding(Packet *packet);
00147 void OnReroute(Packet *packet);
00148 void OnMiniPunchReply(Packet *packet);
00149 void OnMiniPunchReplyBounce(Packet *packet);
00150 bool OnForwardingSuccess(Packet *packet);
00151 int GetLargestPingAmongConnectedSystems(void) const;
00152 void ReturnToUser(MessageID messageId, RakNetGUID endpointGuid, SystemAddress systemAddress);
00153 bool ConnectInternal(RakNetGUID endpointGuid, bool returnConnectionLostOnFailure);
00154
00155 UDPForwarder *udpForwarder;
00156 int maximumForwardingRequests;
00157 DataStructures::List<ConnnectRequest*> connectionRequests;
00158 DataStructures::List<MiniPunchRequest> miniPunchesInProgress;
00159 DataStructures::List<ForwardedConnection> forwardedConnectionList;
00160
00161 void ClearConnectionRequests(void);
00162 void ClearMinipunches(void);
00163 void ClearForwardedConnections(void);
00164 void ClearAll(void);
00165 int ReturnFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid);
00166 void SendFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid);
00167 void SendForwardingSuccess(RakNetGUID sourceGuid, RakNetGUID endpointGuid, unsigned short sourceToDstPort);
00168 void SendOOBFromRakNetPort(OutOfBandIdentifiers oob, BitStream *extraData, SystemAddress sa);
00169 void SendOOBFromSpecifiedSocket(OutOfBandIdentifiers oob, SystemAddress sa, SOCKET socket);
00170 void SendOOBMessages(MiniPunchRequest *mpr);
00171
00172 Router2DebugInterface *debugInterface;
00173 };
00174
00175 }
00176
00177 #endif
00178
00179 #endif // _RAKNET_SUPPORT_*