]> git.sesse.net Git - cubemap/blob - client.h
4e8003110b11c04e20b5a713f44b75cff294133a
[cubemap] / client.h
1 #ifndef _CLIENT_H
2 #define _CLIENT_H 1
3
4 // A Client represents a single connection from a client (watching a single stream).
5
6 #include <stddef.h>
7 #include <time.h>
8 #include <string>
9
10 class ClientProto;
11 struct Stream;
12
13 // Digested statistics for writing to logs etc.
14 struct ClientStats {
15         std::string url;
16         int sock;
17         std::string remote_addr;
18         timespec connect_time;
19         size_t bytes_sent;
20         size_t bytes_lost;
21         size_t num_loss_events;
22 };
23
24 struct Client {
25         Client(int sock);
26
27         // Serialization/deserialization.
28         Client(const ClientProto &serialized, Stream *stream);
29         ClientProto serialize() const;
30
31         ClientStats get_stats() const;
32
33         // The file descriptor associated with this socket.
34         int sock;
35
36         // When the client connected, in terms of CLOCK_MONOTONIC_COARSE.
37         timespec connect_time;
38
39         // Some information only used for logging.
40         std::string remote_addr;
41
42         enum State { READING_REQUEST, SENDING_HEADER, SENDING_DATA, SENDING_ERROR, WAITING_FOR_KEYFRAME, PREBUFFERING };
43         State state;
44
45         // The HTTP request, as sent by the client. If we are in READING_REQUEST,
46         // this might not be finished.
47         std::string request;
48
49         // What stream we're connecting to; parsed from <request>.
50         // Not relevant for READING_REQUEST.
51         std::string url;
52         Stream *stream;
53
54         // The header we want to send. This is nominally a copy of Stream::header,
55         // but since that might change on reconnects etc., we keep a local copy here.
56         // Only relevant for SENDING_HEADER or SENDING_ERROR; blank otherwise.
57         std::string header_or_error;
58
59         // Number of bytes we've sent of the header. Only relevant for SENDING_HEADER
60         // or SENDING_ERROR.
61         size_t header_or_error_bytes_sent;
62
63         // Number of bytes we are into the stream (ie., the end of last send).
64         // -1 means we want to send from the end of the backlog (the normal case),
65         // although only at a keyframe.
66         // -2 means we want to send from the _beginning_ of the backlog.
67         // Once we go into WAITING_FOR_KEYFRAME, PREBUFFERING or SENDING_DATA,
68         // these negative values will be translated to real numbers.
69         size_t stream_pos;
70
71         // Number of bytes we've sent of data. Only relevant for SENDING_DATA.
72         size_t bytes_sent;
73
74         // Number of times we've skipped forward due to the backlog being too big,
75         // and how many bytes we've skipped over in all. Only relevant for SENDING_DATA.
76         size_t bytes_lost, num_loss_events;
77 };
78
79 #endif  // !defined(_CLIENT_H)