Skip to content

Commit 239149e

Browse files
committed
Optimization work with sockets (forwarding)
1 parent 83a1a14 commit 239149e

File tree

5 files changed

+31
-35
lines changed

5 files changed

+31
-35
lines changed

httpserver/DataVariantMultipartFormData.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ namespace HttpServer
8080
// Установить размер буфера данных
8181
const size_t buf_len = (leftBytes >= 512 * 1024) ? 512 * 1024 : leftBytes;
8282

83+
// Создание буферов
8384
std::vector<std::string::value_type> buf(buf_len);
8485
std::string str_buf = str;
8586

httpserver/Server.cpp

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ namespace HttpServer
407407
/**
408408
* Метод для обработки запроса (запускается в отдельном потоке)
409409
*/
410-
int Server::threadRequestProc(Socket &clientSocket)
410+
int Server::threadRequestProc(Socket clientSocket)
411411
{
412412
int app_exit_code;
413413

@@ -817,7 +817,7 @@ namespace HttpServer
817817
return app_exit_code;
818818
}
819819

820-
int Server::cycleQueue(std::queue<std::shared_ptr<Socket> > &sockets)
820+
int Server::cycleQueue(std::queue<Socket> &sockets)
821821
{
822822
auto it_option = settings.find("threads_max_count");
823823

@@ -833,13 +833,10 @@ namespace HttpServer
833833
threads_max_count = System::getProcessorsCount();
834834
}
835835

836-
std::function<int(Server &, Socket &)> serverThreadRequestProc = std::mem_fn(&Server::threadRequestProc);
836+
std::function<int(Server &, Socket)> serverThreadRequestProc = std::mem_fn(&Server::threadRequestProc);
837837

838838
std::vector<std::thread> active_threads;
839-
std::vector<std::shared_ptr<Socket> > active_sockets;
840-
841839
active_threads.reserve(threads_max_count);
842-
active_sockets.reserve(threads_max_count);
843840

844841
while (process_flag)
845842
{
@@ -867,7 +864,6 @@ namespace HttpServer
867864
{
868865
th->join();
869866
active_threads.erase(th);
870-
active_sockets.erase(active_sockets.begin() + i);
871867
}
872868
else
873869
{
@@ -877,11 +873,8 @@ namespace HttpServer
877873

878874
while (active_threads.size() <= threads_max_count && sockets.empty() == false)
879875
{
880-
std::shared_ptr<Socket> client_socket = sockets.front();
876+
active_threads.emplace_back(serverThreadRequestProc, std::ref(*this), std::move(sockets.front() ) );
881877
sockets.pop();
882-
883-
active_threads.emplace_back(serverThreadRequestProc, std::ref(*this), std::ref(*client_socket) );
884-
active_sockets.emplace_back(client_socket);
885878
}
886879

887880
if (false == eventNotFullQueue->notifed() )
@@ -903,17 +896,6 @@ namespace HttpServer
903896
active_threads.clear();
904897
}
905898

906-
if (false == active_sockets.empty() )
907-
{
908-
for (std::shared_ptr<Socket> &sock : active_sockets)
909-
{
910-
sock->shutdown();
911-
sock->close();
912-
}
913-
914-
active_sockets.clear();
915-
}
916-
917899
return 0;
918900
}
919901

@@ -1385,11 +1367,11 @@ namespace HttpServer
13851367
eventNotFullQueue = new Event(true, true);
13861368
eventProcessQueue = new Event();
13871369

1388-
std::queue<std::shared_ptr<Socket> > sockets;
1370+
std::queue<Socket> sockets;
13891371

13901372
process_flag = true;
13911373

1392-
std::function<int(Server &, std::queue<std::shared_ptr<Socket> > &)> serverCycleQueue = std::mem_fn(&Server::cycleQueue);
1374+
std::function<int(Server &, std::queue<Socket> &)> serverCycleQueue = std::mem_fn(&Server::cycleQueue);
13931375
std::thread threadQueue(serverCycleQueue, std::ref(*this), std::ref(sockets) );
13941376

13951377
Socket client_socket;
@@ -1403,7 +1385,7 @@ namespace HttpServer
14031385
if (client_socket.is_open() )
14041386
{
14051387
client_socket.nonblock(true);
1406-
sockets.emplace(new Socket(client_socket) );
1388+
sockets.emplace(std::move(client_socket) );
14071389

14081390
if (sockets.size() <= queue_max_length)
14091391
{

httpserver/Server.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ namespace HttpServer
4040
sig_atomic_t restart_flag;
4141

4242
protected:
43-
int cycleQueue(std::queue<std::shared_ptr<Socket> > &);
44-
int threadRequestProc(Socket &);
43+
int cycleQueue(std::queue<Socket> &);
44+
int threadRequestProc(Socket);
4545
int transferFilePart(const Socket &, const std::chrono::milliseconds &, const std::string &, const time_t, const size_t, const std::string &, const std::string &, const std::string &, const bool) const;
4646
int transferFile(const Socket &, const std::chrono::milliseconds &, const std::string &, const std::unordered_map<std::string, std::string> &, const std::map<std::string, std::string> &, const std::string &, const bool) const;
4747
void parseIncomingVars(std::unordered_multimap<std::string, std::string> &, const std::string &, const size_t, const size_t) const;

httpserver/Socket.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,24 @@ namespace HttpServer
2727
#endif
2828
}
2929

30-
Socket::Socket(): socket_handle(-1)
30+
Socket::Socket(): socket_handle(~0)
3131
{
3232

3333
}
3434

35-
Socket::Socket(const System::native_socket_type handle)
35+
Socket::Socket(const System::native_socket_type handle) : socket_handle(handle)
3636
{
37-
socket_handle = handle;
37+
38+
}
39+
40+
Socket::Socket(const Socket &obj) : socket_handle(obj.socket_handle)
41+
{
42+
43+
}
44+
45+
Socket::Socket(Socket &&that) : socket_handle(that.socket_handle)
46+
{
47+
that.socket_handle = ~0;
3848
}
3949

4050
System::native_socket_type Socket::open()
@@ -60,13 +70,13 @@ namespace HttpServer
6070

6171
if (0 == result)
6272
{
63-
socket_handle = -1;
73+
socket_handle = ~0;
6474
}
6575

6676
return result;
6777
}
6878

69-
return -1;
79+
return ~0;
7080
}
7181

7282
int Socket::bind(const int port) const
@@ -98,7 +108,7 @@ namespace HttpServer
98108

99109
Socket Socket::nonblock_accept() const
100110
{
101-
System::native_socket_type client_socket = -1;
111+
System::native_socket_type client_socket = ~0;
102112
#ifdef WIN32
103113
::fd_set readset;
104114
FD_ZERO(&readset);
@@ -131,7 +141,7 @@ namespace HttpServer
131141

132142
Socket Socket::nonblock_accept(const std::chrono::milliseconds &timeWait) const
133143
{
134-
System::native_socket_type client_socket = -1;
144+
System::native_socket_type client_socket = ~0;
135145
#ifdef WIN32
136146
::fd_set readset;
137147
FD_ZERO(&readset);

httpserver/Socket.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ namespace HttpServer
3737
public:
3838
Socket();
3939
Socket(const System::native_socket_type);
40+
Socket(const Socket &);
41+
Socket(Socket &&);
42+
4043
~Socket() = default;
4144

4245
System::native_socket_type open();
@@ -47,7 +50,7 @@ namespace HttpServer
4750
#ifdef WIN32
4851
return INVALID_SOCKET != socket_handle;
4952
#elif POSIX
50-
return -1 != socket_handle;
53+
return ~0 != socket_handle;
5154
#else
5255
#error "Undefine platform"
5356
#endif

0 commit comments

Comments
 (0)