1 #include <netinet/in.h>
2 #include <sys/socket.h>
5 #include <boost/algorithm/string/classification.hpp>
6 #include <boost/algorithm/string/split.hpp>
7 #include <condition_variable>
15 #include "wordscapes/wordscapes.h"
19 std::queue
<std::pair
<int, std::string
>> qu
;
26 void thread_on_msg(int i
)
38 int client_fd
= qu
.front().first
;
39 std::string msg
= qu
.front().second
;
44 std::cout
<< "Thread " << i
<< " receive: " << msg
<< std::endl
;
46 std::vector
<std::string
> msg_vt
;
47 boost::split(msg_vt
, msg
, boost::is_any_of(";"));
49 auto result
= ws
.solve(msg_vt
[0], msg_vt
[1]);
52 for (auto& res
: result
) ret
+= res
+ ';';
54 send(client_fd
, ret
.c_str(), ret
.size(), 0);
55 std::cout
<< "Thread " << i
<< " send: " << ret
<< std::endl
;
60 if (!qu
.empty()) mtx_th
.unlock();
67 struct sockaddr_in server_addr
;
68 struct sockaddr_storage client_addr
;
69 int addrlen
= sizeof(server_addr
);
70 server_addr
.sin_family
= AF_INET
;
71 server_addr
.sin_addr
.s_addr
= INADDR_ANY
;
72 server_addr
.sin_port
= htons(PORT
);
76 if ((server_fd
= socket(AF_INET
, SOCK_STREAM
, 0)) == 0)
78 perror("socket failed");
83 if (setsockopt(server_fd
, SOL_SOCKET
, SO_REUSEADDR
| SO_REUSEPORT
, &opt
,
90 if (bind(server_fd
, (struct sockaddr
*)&server_addr
, sizeof(server_addr
)) <
93 perror("bind failed");
97 if (listen(server_fd
, 5) < 0)
103 std::thread threads
[5];
104 for (int i
= 0; i
< 5; i
++) threads
[i
] = std::thread(thread_on_msg
, i
);
108 socklen_t clientAddr_len
= sizeof(client_addr
);
110 accept(server_fd
, (struct sockaddr
*)&client_addr
, &clientAddr_len
);
111 char buffer
[1024] = {0};
112 recv(new_socket
, buffer
, 1024, 0);
115 qu
.push({new_socket
, std::string(buffer
)});
119 for (int i
= 0; i
< 5; i
++) threads
[i
].join();