X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.cpp;h=d894bd14d0a85d05783366fb60f0394fcf7c86dc;hp=b914b2ec4fbaa50175021038e42ed9161cd21bad;hb=5812a7b5bb19068cff68c2946aa67a2a132717c7;hpb=4971ba0e48d77b075fc972c13ec2978aa93630a1 diff --git a/server.cpp b/server.cpp index b914b2e..d894bd1 100644 --- a/server.cpp +++ b/server.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "metacube.h" #include "server.h" @@ -220,10 +221,18 @@ void Server::process_client(Client *client) } // See if we need to split across the circular buffer. - int ret; + ssize_t ret; if ((client->bytes_sent % BACKLOG_SIZE) + bytes_to_send > BACKLOG_SIZE) { - // TODO: writev - assert(false); + size_t bytes_first_part = BACKLOG_SIZE - (client->bytes_sent % BACKLOG_SIZE); + + iovec iov[2]; + iov[0].iov_base = const_cast(stream.data + (client->bytes_sent % BACKLOG_SIZE)); + iov[0].iov_len = bytes_first_part; + + iov[1].iov_base = const_cast(stream.data); + iov[1].iov_len = bytes_to_send - bytes_first_part; + + ret = writev(client->sock, iov, 2); } else { ret = write(client->sock, stream.data + (client->bytes_sent % BACKLOG_SIZE), @@ -276,6 +285,11 @@ void Server::close_client(Client *client) perror("epoll_ctl(EPOLL_CTL_DEL)"); exit(1); } + + // This client could be sleeping, so we'll need to fix that. (Argh, O(n).) + vector::iterator new_end = + remove(sleeping_clients.begin(), sleeping_clients.end(), client->sock); + sleeping_clients.erase(new_end, sleeping_clients.end()); // Bye-bye! close(client->sock);