-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
124 lines (117 loc) · 4.61 KB
/
main.cpp
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "Server.hpp"
#include <fstream>
#include <vector>
#include "httpstuff/Request.hpp"
#include "httpstuff/Response.hpp"
#include "parse/DataConfig.hpp"
// cretae a socket
// bind the socket to IP / port
// mark the socket for listening
// accept a call
// close the listening socket
//
// close socket
int main()
{
Server server;
ParseConfigFile config;
config.parser("./parse/configfile.txt");
for (size_t i = 0; i < config.getData().size(); i++)
{
server.createSocket(config.getData()[i]);
}
server.createServer(config.getData());
server.putServerOnListening();
std::vector<int> activeConnections;
fd_set setOfFds, readSet, writeSet;
FD_ZERO(&setOfFds);
int max_fd = -1;
for (size_t i = 0; i < server.getServerSockets().size(); i++)
{
int fd = server.getServerSocket(i);
FD_SET(fd, &setOfFds);
if (fd > max_fd)
max_fd = fd;
}
while (true)
{
readSet = setOfFds;
writeSet = setOfFds;
int selectResult = select(max_fd + 1, &readSet, &writeSet, NULL, NULL);
if (selectResult == -1)
{
std::cerr << "Error in select\n";
return 1;
}
for (size_t i = 0; i < server.getServerSockets().size(); i++)
{
if (FD_ISSET(server.getServerSocket(i), &readSet))
{
int clientSocket = accept(server.getServerSocket(i), NULL, NULL);
if (clientSocket == -1)
{
std::cerr << "Error accepting client connection\n";
}
else
{
int flags = fcntl(clientSocket, F_GETFL, 0);
if (flags == -1) {
std::cerr << "Error getting flags for socket\n";
return 1;
}
// std::cout << "*********************************>flags : " << flags << "\n";
flags |= O_NONBLOCK;
if (fcntl(clientSocket, F_SETFL, flags) == -1) {
std::cerr << "Error setting socket to non-blocking\n";
return 1;
}
std::cout << "New client connected, socket: " << clientSocket << "\n";
if (clientSocket > max_fd)
max_fd = clientSocket;
// std::cout << "max = " << max_fd << "\n";
activeConnections.push_back(clientSocket);
FD_SET(clientSocket, &setOfFds);
server.setServer(clientSocket, server.getServers()[server.getServerSocket(i)]);
}
}
}
for(std::vector<int>::iterator it = activeConnections.begin(); it != activeConnections.end(); ++it)
{
if (FD_ISSET(*it, &readSet))
{
char buffer[4096];
memset(buffer, 0, 4096);
ssize_t bytesRead = recv(*it, buffer, 4096 - 1, 0); //receive request
if (bytesRead > 0)
{
DataConfig config = server.getServers()[*it];
// std::vector<Location> locations = config.getLocation();
// for (size_t i = 0; i < locations.size(); i++) {
// std::cout << locations[i].location << std::endl;
// }
std::cout << buffer << std::endl;
Request req(buffer);
std::cout << "i am her a ba " << req.getRequestMethod() << std::endl;
Response response = req.handleRequest(config);
response.sendResponse(*it);
}
else if (bytesRead == 0)
{
// Connection closed by the client
std::cout << "Client disconnected, socket: " << *it << "\n";
close(*it);
FD_CLR(*it, &setOfFds);
it = activeConnections.erase(it) - 1; // Decrement iterator to avoid skipping the next element
}
else
{
// Error in recv
std::cerr << "Error receiving data from client, socket: " << *it << "\n";
close(*it);
FD_CLR(*it, &setOfFds);
it = activeConnections.erase(it) - 1;
}
}
}
}
}