-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.cpp
More file actions
69 lines (56 loc) · 2.01 KB
/
server.cpp
File metadata and controls
69 lines (56 loc) · 2.01 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
#include <iostream>
#include "sock_wrap.hpp"
#include "Parser.hpp"
#define BACKLOG 10
#define ADDRESS "my_socket"
int main()
{
// creating server socket
UnServerSocket sock(ADDRESS);
try {
sock.bind();
sock.listen(BACKLOG);
signals_set_handlers();
// listening
while (true) {
BaseSocket *sock_client = sock.accept();
int got_request;
while ((got_request = sock_client->read(&got_request, sizeof got_request))) {
int fd[2];
SAFE_SYS(pipe(fd), "Too long request");
try {
std::string request = sock_client->get_string();
Parser parser(fd[0]);
SAFE_SYS(write(fd[1], request.c_str(), request.size()), "Write to scanner error");
close(fd[1]);
// parsing
parser.parse();
close(fd[0]);
// calculating result
bool tmp_table;
Table table = parser.execute(tmp_table);
if (tmp_table) table.drop();
// sending result to client
size_t size = table.size() + 1;
sock_client->write(&size, sizeof size);
sock_client->put_string(table.struct_to_string());
for (auto i = table.begin(); i != table.end(); ++i) {
sock_client->put_string((*i).to_string());
}
} catch (const ExceptionBase &err) {
std::cerr << err << std::endl;
size_t size = 1;
sock_client->write(&size, sizeof size);
sock_client->put_string(err.get_msg() + "\n");
}
}
delete sock_client;
}
sock.shutdown();
sock.close();
} catch (const ExceptionBase &err) {
sock.close();
std::cerr << err << std::endl;
}
return 0;
}