]> git.sesse.net Git - cubemap/blobdiff - client.cpp
Identify UDPInput error messages by the stream, too.
[cubemap] / client.cpp
index be47e0e23b2c52a52e4a130528be3451aa9b250b..5871da1ed70fb111a85db1bcf278735f64a6b62e 100644 (file)
@@ -1,13 +1,13 @@
+#include <arpa/inet.h>
+#include <netinet/in.h>
 #include <stdio.h>
-#include <unistd.h>
 #include <sys/socket.h>
-#include <arpa/inet.h>
-#include <errno.h>
 
 #include "client.h"
+#include "log.h"
 #include "markpool.h"
-#include "stream.h"
 #include "state.pb.h"
+#include "stream.h"
 
 using namespace std;
 
@@ -18,7 +18,10 @@ Client::Client(int sock)
          state(Client::READING_REQUEST),
          stream(NULL),
          header_or_error_bytes_sent(0),
-         bytes_sent(0)
+         stream_pos(0),
+         bytes_sent(0),
+         bytes_lost(0),
+         num_loss_events(0)
 {
        request.reserve(1024);
 
@@ -27,12 +30,12 @@ Client::Client(int sock)
        socklen_t addr_len = sizeof(addr);
 
        if (getpeername(sock, reinterpret_cast<sockaddr *>(&addr), &addr_len) == -1) {
-               perror("getpeername");
+               log_perror("getpeername");
                remote_addr = "";
        } else {
                char buf[INET6_ADDRSTRLEN];
                if (inet_ntop(addr.sin6_family, &addr.sin6_addr, buf, sizeof(buf)) == NULL) {
-                       perror("inet_ntop");
+                       log_perror("inet_ntop");
                        remote_addr = "";
                } else {
                        remote_addr = buf;
@@ -50,17 +53,21 @@ Client::Client(const ClientProto &serialized, Stream *stream)
          stream(stream),
          header_or_error(serialized.header_or_error()),
          header_or_error_bytes_sent(serialized.header_or_error_bytes_sent()),
-         bytes_sent(serialized.bytes_sent())
+         stream_pos(serialized.stream_pos()),
+         bytes_sent(serialized.bytes_sent()),
+         bytes_lost(serialized.bytes_lost()),
+         num_loss_events(serialized.num_loss_events())
 {
-       if (stream->mark_pool != NULL) {
+       if (stream != NULL && stream->mark_pool != NULL) {
                fwmark = stream->mark_pool->get_mark();
        } else {
                fwmark = 0;  // No mark.
        }
        if (setsockopt(sock, SOL_SOCKET, SO_MARK, &fwmark, sizeof(fwmark)) == -1) {
                if (fwmark != 0) {
-                       perror("setsockopt(SO_MARK)");
+                       log_perror("setsockopt(SO_MARK)");
                }
+               fwmark = 0;
        }
 }
 
@@ -75,7 +82,10 @@ ClientProto Client::serialize() const
        serialized.set_stream_id(stream_id);
        serialized.set_header_or_error(header_or_error);
        serialized.set_header_or_error_bytes_sent(serialized.header_or_error_bytes_sent());
+       serialized.set_stream_pos(stream_pos);
        serialized.set_bytes_sent(bytes_sent);
+       serialized.set_bytes_lost(bytes_lost);
+       serialized.set_num_loss_events(num_loss_events);
        return serialized;
 }
        
@@ -83,8 +93,12 @@ ClientStats Client::get_stats() const
 {
        ClientStats stats;
        stats.stream_id = stream_id;
+       stats.sock = sock;
+       stats.fwmark = fwmark;
        stats.remote_addr = remote_addr;
        stats.connect_time = connect_time;
        stats.bytes_sent = bytes_sent;
+       stats.bytes_lost = bytes_lost;
+       stats.num_loss_events = num_loss_events;
        return stats;
 }