Implement basic data sending support.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Apr 2013 15:56:48 +0000 (17:56 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Apr 2013 15:56:48 +0000 (17:56 +0200)
server.cpp

index 0b399e4..d6b5b5b 100644 (file)
@@ -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