2 #include <netinet/in.h>
4 #include <sys/socket.h>
11 #ifndef SO_MAX_PACING_RATE
12 #define SO_MAX_PACING_RATE 47
17 Client::Client(int sock)
19 connect_time(time(NULL)),
20 state(Client::READING_REQUEST),
22 header_or_error_bytes_sent(0),
28 request.reserve(1024);
30 // Find the remote address, and convert it to ASCII.
32 socklen_t addr_len = sizeof(addr);
34 if (getpeername(sock, reinterpret_cast<sockaddr *>(&addr), &addr_len) == -1) {
35 log_perror("getpeername");
40 char buf[INET6_ADDRSTRLEN];
41 if (IN6_IS_ADDR_V4MAPPED(&addr.sin6_addr)) {
42 // IPv4 address, really.
43 if (inet_ntop(AF_INET, &addr.sin6_addr.s6_addr32[3], buf, sizeof(buf)) == NULL) {
44 log_perror("inet_ntop");
50 if (inet_ntop(addr.sin6_family, &addr.sin6_addr, buf, sizeof(buf)) == NULL) {
51 log_perror("inet_ntop");
59 Client::Client(const ClientProto &serialized, Stream *stream)
60 : sock(serialized.sock()),
61 remote_addr(serialized.remote_addr()),
62 connect_time(serialized.connect_time()),
63 state(State(serialized.state())),
64 request(serialized.request()),
65 url(serialized.url()),
67 header_or_error(serialized.header_or_error()),
68 header_or_error_bytes_sent(serialized.header_or_error_bytes_sent()),
69 stream_pos(serialized.stream_pos()),
70 bytes_sent(serialized.bytes_sent()),
71 bytes_lost(serialized.bytes_lost()),
72 num_loss_events(serialized.num_loss_events())
75 if (setsockopt(sock, SOL_SOCKET, SO_MAX_PACING_RATE, &stream->pacing_rate, sizeof(stream->pacing_rate)) == -1) {
76 if (stream->pacing_rate != ~0U) {
77 log_perror("setsockopt(SO_MAX_PACING_RATE)");
83 ClientProto Client::serialize() const
85 ClientProto serialized;
86 serialized.set_sock(sock);
87 serialized.set_remote_addr(remote_addr);
88 serialized.set_connect_time(connect_time);
89 serialized.set_state(state);
90 serialized.set_request(request);
91 serialized.set_url(url);
92 serialized.set_header_or_error(header_or_error);
93 serialized.set_header_or_error_bytes_sent(serialized.header_or_error_bytes_sent());
94 serialized.set_stream_pos(stream_pos);
95 serialized.set_bytes_sent(bytes_sent);
96 serialized.set_bytes_lost(bytes_lost);
97 serialized.set_num_loss_events(num_loss_events);
101 ClientStats Client::get_stats() const
110 stats.remote_addr = remote_addr;
111 stats.connect_time = connect_time;
112 stats.bytes_sent = bytes_sent;
113 stats.bytes_lost = bytes_lost;
114 stats.num_loss_events = num_loss_events;