X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=cubemap.cpp;h=5ef003640ff1cc5780c6cd79c43687324193fcc6;hp=98db848152a380b9a279f4ac29e57ceedcf0a8d0;hb=286d8e26057bda2f472bbefbb7792ff2ca9f1b65;hpb=519ddcdf0458032a2024d7acc57642fe27829dc0 diff --git a/cubemap.cpp b/cubemap.cpp index 98db848..5ef0036 100644 --- a/cubemap.cpp +++ b/cubemap.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ #include "metacube.h" #include "server.h" #include "input.h" +#include "state.pb.h" #define NUM_SERVERS 4 #define STREAM_ID "stream" @@ -26,6 +28,12 @@ using namespace std; Server *servers = NULL; +volatile bool hupped = false; + +void hup(int ignored) +{ + hupped = true; +} int create_server_socket(int port) { @@ -35,6 +43,12 @@ int create_server_socket(int port) exit(1); } + int one = 1; + if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) { + perror("setsockopt(SO_REUSEADDR)"); + exit(1); + } + // We want dual-stack sockets. (Sorry, OpenBSD and Windows XP...) int zero = 0; if (setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) == -1) { @@ -104,6 +118,32 @@ int main(int argc, char **argv) pthread_t acceptor_thread; pthread_create(&acceptor_thread, NULL, acceptor_thread_run, reinterpret_cast(server_sock)); - Input input(STREAM_ID); - input.run(STREAM_URL); + Input input(STREAM_ID, STREAM_URL); + input.run(); + + signal(SIGHUP, hup); + + while (!hupped) { + usleep(100000); + } + + input.stop(); + + CubemapStateProto state; + for (int i = 0; i < NUM_SERVERS; ++i) { + servers[i].stop(); + + CubemapStateProto local_state = servers[i].serialize(); + + // The stream state should be identical between the servers, so we only store it once. + if (i == 0) { + state.mutable_streams()->MergeFrom(local_state.streams()); + } + for (int j = 0; j < local_state.clients_size(); ++j) { + state.add_clients()->MergeFrom(local_state.clients(j)); + } + } + delete[] servers; + + printf("SERIALIZED: [%s]\n", state.DebugString().c_str()); }