X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.cpp;h=d6b5b5b8b783446ce08e87972b34430b9bf4e547;hp=0b399e4893d25727cff6e3b723426758d89229c3;hb=a31f0050d6f82fdfec7218dfbe86f777777e3029;hpb=0d11fa250f50792b1fdc384ca278d43552bdc92d 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