Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00019 #include "MessageConnection.h"
00020 #include "SequentialIntegerSet.h"
00021 #include "Array.h"
00022 #include "OrderedHashTable.h"
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 namespace kNet
00061 {
00062
00063 class UDPMessageConnection : public MessageConnection
00064 {
00065 public:
00066 UDPMessageConnection(Network *owner, NetworkServer *ownerServer, Socket *socket, ConnectionState startingState);
00067 ~UDPMessageConnection();
00068
00069 void SetDatagramInFlowRatePerSecond(int newDatagramReceiveRate, bool internalCall);
00070
00071 private:
00074 virtual SocketReadResult ReadSocket(size_t &bytesRead);
00075
00077 void ExtractMessages(const char *data, size_t numBytes);
00078
00082 SocketReadResult UDPReadSocket(size_t &bytesRead);
00083
00084
00085 void PerformFlowControl();
00086 void HandleFlowControlRequestMessage(const char *data, size_t numBytes);
00087
00088 void UpdateRTOCounterOnPacketAck(float rtt);
00089 void UpdateRTOCounterOnPacketLoss();
00090
00091
00092 void SendDisconnectMessage(bool isInternal);
00093 void HandleDisconnectMessage();
00094 void SendDisconnectAckMessage();
00095 void HandleDisconnectAckMessage();
00096
00097
00098 void PerformPacketAckSends();
00099 void SendPacketAckMessage();
00100 void HandlePacketAckMessage(const char *data, size_t numBytes);
00101
00102 bool HandleMessage(packet_id_t packetID, u32 messageID, const char *data, size_t numBytes);
00103
00105 void ComputePacketLoss();
00106
00108 void AddReceivedPacketIDStats(packet_id_t packetID);
00110 bool HaveReceivedPacketID(packet_id_t packetID) const;
00111
00113 packet_id_t lastReceivedInOrderPacketID;
00114
00116 packet_id_t lastSentInOrderPacketID;
00117
00119 packet_id_t datagramPacketIDCounter;
00120
00122 float retransmissionTimeout;
00123
00126 tick_t lastFrameTime;
00127 int numAcksLastFrame;
00128 int numLossesLastFrame;
00129
00131 float datagramSendRate;
00132
00133 float lowestDatagramSendRateOnPacketLoss;
00134
00135
00136 bool rttCleared;
00137 float smoothedRTT;
00138 float rttVariation;
00139
00140
00141
00142 float packetLossRate;
00143 float packetLossCount;
00144
00146 struct PacketAckTrack
00147 {
00148 PacketAckTrack()
00149 :sendCount(0)
00150 {
00151 }
00152
00154 tick_t sentTick;
00155
00157 tick_t timeoutTick;
00158
00160 packet_id_t packetID;
00161
00163 float datagramSendRate;
00164
00166 int sendCount;
00167
00169 bool inOrder;
00170
00172 packet_id_t previousInOrderPacketID;
00173
00174 Array<NetworkMessage*> messages;
00175
00176 static int Hash(const PacketAckTrack &item, int maxElemsMask) { return item.packetID & maxElemsMask; }
00177 static int Hash(int key, int maxElemsMask) { return key & maxElemsMask; }
00178 };
00179
00180 void ProcessPacketTimeouts();
00181 void HandleFlowControl();
00182
00183 void DoUpdateConnection();
00184
00185 PacketSendResult SendOutPacket();
00186 void SendOutPackets();
00187 unsigned long TimeUntilCanSendPacket() const;
00188
00189 void PerformDisconnection();
00190
00192 bool CanSendOutNewDatagram() const;
00193
00195 void NewDatagramSent();
00196
00198 mutable tick_t lastDatagramSendTime;
00199
00201 PolledTimer udpUpdateTimer;
00202
00203 PolledTimer statsUpdateTimer;
00204
00205 typedef std::map<packet_id_t, PacketAckTrack> PacketAckTrackMap;
00207
00208 typedef WaitFreeQueue<PacketAckTrack> PacketAckTrackQueue;
00209
00210 OrderedHashTable<PacketAckTrack, PacketAckTrack> outboundPacketAckTrack;
00211
00212 static int BiasedBinarySearchFindPacketIndex(UDPMessageConnection::PacketAckTrackQueue &queue, int packetID);
00213
00214 void FreeOutboundPacketAckTrack(packet_id_t packetID);
00215
00216
00217 PacketAckTrackMap inboundPacketAckTrack;
00218
00220 int datagramOutRatePerSecond;
00221
00225 int datagramInRatePerSecond;
00226
00229 std::set<unsigned long> receivedReliableMessages;
00230
00231 SequentialIntegerSet receivedPacketIDs;
00232
00233
00234
00235
00236 std::vector<NetworkMessage *> datagramSerializedMessages;
00237 std::vector<NetworkMessage *> skippedMessages;
00238 std::vector<char> assembledData;
00239
00241 float GetPacketLossCount() const { return packetLossCount; }
00242
00244 float GetPacketLossRate() const { return packetLossRate; }
00245
00246 void Initialize();
00247
00248 void DumpConnectionStatus() const;
00249
00250 friend class NetworkServer;
00251 };
00252
00253 }