Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __UDP_FORWARDER_H
00010 #define __UDP_FORWARDER_H
00011
00012 #include "Export.h"
00013 #include "DS_Multilist.h"
00014 #include "RakNetTypes.h"
00015 #include "SocketIncludes.h"
00016 #include "UDPProxyCommon.h"
00017 #include "SimpleMutex.h"
00018 #include "RakString.h"
00019 #include "RakThread.h"
00020 #include "DS_Queue.h"
00021
00022 #define UDP_FORWARDER_EXECUTE_THREADED
00023
00024 namespace RakNet
00025 {
00026
00027 enum UDPForwarderResult
00028 {
00029 UDPFORWARDER_FORWARDING_ALREADY_EXISTS,
00030 UDPFORWARDER_NO_SOCKETS,
00031 UDPFORWARDER_INVALID_PARAMETERS,
00032 UDPFORWARDER_SUCCESS,
00033
00034 };
00035
00038 class RAK_DLL_EXPORT UDPForwarder
00039 {
00040 public:
00041 UDPForwarder();
00042 ~UDPForwarder();
00043
00046 void Startup(void);
00047
00049 void Shutdown(void);
00050
00053 void Update(void);
00054
00059 void SetMaxForwardEntries(unsigned short maxEntries);
00060
00062 int GetMaxForwardEntries(void) const;
00063
00066 int GetUsedForwardEntries(void) const;
00067
00081 UDPForwarderResult StartForwarding(SystemAddress source, SystemAddress destination, RakNetTimeMS timeoutOnNoDataMS, const char *forceHostAddress,
00082 unsigned short *srcToDestPort, unsigned short *destToSourcePort, SOCKET *srcToDestSocket, SOCKET *destToSourceSocket);
00083
00087 void StopForwarding(SystemAddress source, SystemAddress destination);
00088
00089 struct SrcAndDest
00090 {
00091 SystemAddress source;
00092 SystemAddress destination;
00093 };
00094
00095 struct ForwardEntry
00096 {
00097 ForwardEntry();
00098 ~ForwardEntry();
00099 SrcAndDest srcAndDest;
00100 RakNetTimeMS timeLastDatagramForwarded;
00101 SOCKET readSocket;
00102 SOCKET writeSocket;
00103 RakNetTimeMS timeoutOnNoDataMS;
00104 bool updatedSourceAddress;
00105 };
00106
00107 #ifdef UDP_FORWARDER_EXECUTE_THREADED
00108 struct ThreadOperation
00109 {
00110 enum {
00111 TO_NONE,
00112 TO_START_FORWARDING,
00113 TO_STOP_FORWARDING,
00114 } operation;
00115
00116 SystemAddress source;
00117 SystemAddress destination;
00118 RakNetTimeMS timeoutOnNoDataMS;
00119 RakNet::RakString forceHostAddress;
00120 unsigned short srcToDestPort;
00121 unsigned short destToSourcePort;
00122 SOCKET srcToDestSocket;
00123 SOCKET destToSourceSocket;
00124 UDPForwarderResult result;
00125 };
00126 SimpleMutex threadOperationIncomingMutex,threadOperationOutgoingMutex;
00127 DataStructures::Queue<ThreadOperation> threadOperationIncomingQueue;
00128 DataStructures::Queue<ThreadOperation> threadOperationOutgoingQueue;
00129 #endif
00130 void UpdateThreaded(void);
00131 UDPForwarderResult StartForwardingThreaded(SystemAddress source, SystemAddress destination, RakNetTimeMS timeoutOnNoDataMS, const char *forceHostAddress,
00132 unsigned short *srcToDestPort, unsigned short *destToSourcePort, SOCKET *srcToDestSocket, SOCKET *destToSourceSocket);
00133 void StopForwardingThreaded(SystemAddress source, SystemAddress destination);
00134
00135 DataStructures::Multilist<ML_ORDERED_LIST, ForwardEntry*, SrcAndDest> forwardList;
00136 unsigned short maxForwardEntries;
00137
00138 unsigned short AddForwardingEntry(SrcAndDest srcAndDest, RakNetTimeMS timeoutOnNoDataMS, const char *forceHostAddress);
00139
00140
00141 bool isRunning, threadRunning;
00142
00143 };
00144
00145 }
00146
00147 #endif