From a31f0050d6f82fdfec7218dfbe86f777777e3029 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 6 Apr 2013 17:56:48 +0200 Subject: [PATCH] Implement basic data sending support. --- server.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/server.cpp b/server.cpp index 0b399e4..d6b5b5b 100644 --- a/server.cpp +++ b/server.cpp @@ -185,6 +185,38 @@ void Server::process_client(Client *client) // but we'll start sending immediately as we get data. client->state = Client::SENDING_DATA; client->bytes_sent = streams[client->stream_id].data_size; + break; + } + case Client::SENDING_DATA: { + // See if there's some data we've lost. Ideally, we should drop to a block boundary, + // but resync will be the mux's problem. + const Stream &stream = streams[client->stream_id]; + size_t bytes_to_send = stream.data_size - client->bytes_sent; + if (bytes_to_send > BACKLOG_SIZE) { + fprintf(stderr, "WARNING: fd %d lost %lld bytes, maybe too slow connection\n", + client->sock, + (long long int)(bytes_to_send - BACKLOG_SIZE)); + client->bytes_sent = streams[client->stream_id].data_size - BACKLOG_SIZE; + bytes_to_send = BACKLOG_SIZE; + } + + // See if we need to split across the circular buffer. + int ret; + if ((client->bytes_sent % BACKLOG_SIZE) + bytes_to_send > BACKLOG_SIZE) { + // TODO: writev + assert(false); + } else { + ret = write(client->sock, + stream.data + (client->bytes_sent % BACKLOG_SIZE), + bytes_to_send); + } + if (ret == -1) { + perror("write/writev"); + close_client(client); + return; + } + client->bytes_sent += ret; + break; } default: // TODO -- 2.39.2