-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.cpp
More file actions
86 lines (69 loc) · 2.31 KB
/
server.cpp
File metadata and controls
86 lines (69 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#define DEFAULT_PORT 4242
#define THREADING_FORK 1
#define THREADING_PTHREAD 2
#define ASIO_ASYNC 3
#ifndef SERVER_MODEL
#define SERVER_MODEL ASIO_ASYNC
#endif
#include <iostream>
#include <boost/serialization/vector.hpp>
#include <boost/program_options.hpp>
#include "connection/connection.h"
#if (SERVER_MODEL == THREADING_FORK || SERVER_MODEL == THREADING_PTHREAD)
#include "socket/TCPSocket.h"
#include "thread/myThread.h"
using namespace concurrent;
#elif (SERVER_MODEL == ASIO_ASYNC)
#include "tcp_server/asioTcpServer.h"
#endif
using namespace std;
using namespace boost::program_options;
template <class Socket>
void handleRequest(Socket &socket) {
vector<double> provided_vector = serializedRead< vector<double> >(socket);
sort(begin(provided_vector), end(provided_vector));
serializedWrite(socket, provided_vector);
}
int main(int argc, char *argv[]) {
unsigned short port;
options_description desc("Client options");
desc.add_options()
("help,h", "produce help message")
("port,p", value<unsigned short>(&port)->default_value(DEFAULT_PORT), "server port");
variables_map args;
try {
parsed_options parsed = command_line_parser(argc, argv).options(desc).run();
store(parsed, args);
notify(args);
} catch(std::exception& ex) {
cerr << desc << endl;
exit(EXIT_FAILURE);
}
#if (SERVER_MODEL == THREADING_FORK || SERVER_MODEL == THREADING_PTHREAD)
InTCPSocket server_socket(port);
while (true) {
auto new_socket = server_socket.accept_connection();
#if (SERVER_MODEL == THREADING_FORK)
if ( !fork() ) {
handleRequest(*new_socket.get());
break;
}
#elif (SERVER_MODEL == THREADING_PTHREAD)
auto socket_ptr = new unique_ptr<TCPSocket>(std::move(new_socket));
Thread task_thread([](void* socket)->void* {
unique_ptr<TCPSocket>* data_socket = (unique_ptr<TCPSocket>*)socket;
handleRequest(*(*data_socket).get());
delete data_socket;
return nullptr;
}, socket_ptr);
task_thread.deatch();
#endif
}
#elif (SERVER_MODEL == ASIO_ASYNC)
AsioTCP::TCPServer server(port, [] (AsioTCP::TCPServer::socket_ptr socket)->void {
handleRequest(*socket);
});
server.run();
#endif
return 0;
}