From: Steinar H. Gunderson Date: Sat, 6 Apr 2013 15:56:48 +0000 (+0200) Subject: Implement basic data sending support. X-Git-Tag: 1.0.0~216 X-Git-Url: https://git.sesse.net/?p=cubemap;a=commitdiff_plain;h=a31f0050d6f82fdfec7218dfbe86f777777e3029;ds=sidebyside Implement basic data sending support. --- 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