]> git.sesse.net Git - cubemap/blob - server.cpp
Set SO_REUSEADDR on the server socket.
[cubemap] / server.cpp
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdint.h>
4 #include <assert.h>
5 #include <arpa/inet.h>
6 #include <curl/curl.h>
7 #include <sys/socket.h>
8 #include <pthread.h>
9 #include <sys/types.h>
10 #include <sys/ioctl.h>
11 #include <sys/epoll.h>
12 #include <errno.h>
13 #include <vector>
14 #include <string>
15 #include <map>
16
17 #include "metacube.h"
18 #include "server.h"
19 #include "mutexlock.h"
20
21 using namespace std;
22
23 Server::Server()
24 {
25         pthread_mutex_init(&mutex, NULL);
26
27         epoll_fd = epoll_create(1024);  // Size argument is ignored.
28         if (epoll_fd == -1) {
29                 perror("epoll_fd");
30                 exit(1);
31         }
32 }
33
34 void Server::run()
35 {
36         pthread_t thread;
37         pthread_create(&thread, NULL, Server::do_work_thunk, this);
38 }
39
40 void *Server::do_work_thunk(void *arg)
41 {
42         Server *server = static_cast<Server *>(arg);
43         server->do_work();
44         return NULL;
45 }
46
47 void Server::do_work()
48 {
49         for ( ;; ) {
50                 MutexLock lock(&mutex);
51                 printf("server thread running\n");
52                 sleep(1);
53         }
54 }
55         
56 void Server::add_client(int sock)
57 {
58         MutexLock lock(&mutex);
59         Client new_client;
60         new_client.state = Client::READING_REQUEST;
61         new_client.header_bytes_sent = 0;
62         new_client.bytes_sent = 0;
63
64         clients.insert(make_pair(sock, new_client));
65
66         // Start listening on data from this socket.
67         epoll_event ev;
68         ev.events = EPOLLIN;
69         ev.data.fd = sock;
70         if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock, &ev) == -1) {
71                 perror("epoll_ctl(EPOLL_CTL_ADD)");
72                 exit(1);
73         }
74 }
75         
76 void Server::add_stream(const string &stream_id)
77 {
78         // TODO
79 }
80         
81 void Server::set_header(const string &stream_id, const string &header)
82 {
83         // TODO
84         printf("got header! %lu bytes\n", header.size());
85 }
86         
87 void Server::add_data(const string &stream_id, const char *data, size_t bytes)
88 {
89         // TODO
90 }