]> git.localhorst.tv Git - blank.git/blobdiff - src/net/net.cpp
keep track of packet loss
[blank.git] / src / net / net.cpp
index 81de3e476e8286245e574905081b047d28b17308..0f8aa216c42f8c57b1fcfb667ac75216610b7976 100644 (file)
@@ -118,14 +118,14 @@ void Connection::Received(const UDPpacket &udp_pack) {
                if (diff > 0) {
                        for (int i = 0; i < diff; ++i) {
                                if (i > 32 || (i < 32 && (ctrl_in.hist & (1 << (31 - i))) == 0)) {
-                                       Handler().OnPacketLost(ctrl_in.ack - 32 + i);
+                                       Handler().PacketLost(ctrl_in.ack - 32 + i);
                                }
                        }
                }
                // check for newly ack'd packets
                for (uint16_t s = ctrl_new.AckBegin(); s != ctrl_new.AckEnd(); --s) {
                        if (ctrl_new.Acks(s) && !ctrl_in.Acks(s)) {
-                               Handler().OnPacketReceived(s);
+                               Handler().PacketReceived(s);
                        }
                }
                ctrl_in = ctrl_new;
@@ -145,6 +145,35 @@ uint16_t Connection::SendPing(UDPpacket &udp_pack, UDPsocket sock) {
 }
 
 
+ConnectionHandler::ConnectionHandler()
+: packets_lost(0)
+, packets_received(0)
+, packet_loss(0.0f) {
+
+}
+
+void ConnectionHandler::PacketLost(uint16_t seq) {
+       OnPacketLost(seq);
+       ++packets_lost;
+       UpdatePacketLoss();
+}
+
+void ConnectionHandler::PacketReceived(uint16_t seq) {
+       OnPacketReceived(seq);
+       ++packets_received;
+       UpdatePacketLoss();
+}
+
+void ConnectionHandler::UpdatePacketLoss() noexcept {
+       unsigned int packets_total = packets_lost + packets_received;
+       if (packets_total >= 256) {
+               packet_loss = float(packets_lost) / float(packets_total);
+               packets_lost = 0;
+               packets_received = 0;
+       }
+}
+
+
 ostream &operator <<(ostream &out, const IPaddress &addr) {
        const unsigned char *host = reinterpret_cast<const unsigned char *>(&addr.host);
        out << int(host[0])