-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathecho_blocking_server.cpp
More file actions
49 lines (40 loc) · 1.51 KB
/
echo_blocking_server.cpp
File metadata and controls
49 lines (40 loc) · 1.51 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
#include "include/socket/tcp_listener.hpp"
#include <atomic>
#include <iostream>
#include <thread>
namespace net = OFCT::networking;
class echo_server
: public net::tcp_listener<net::sockaddr_type_in, false> {
public:
explicit echo_server(int backlog = std::numeric_limits<int>::max())
: net::tcp_listener<net::sockaddr_type_in, false>(backlog) {}
explicit echo_server(in_port_t port, in_addr_t ip = INADDR_ANY, int backlog = std::numeric_limits<int>::max())
: net::tcp_listener<net::sockaddr_type_in, false>(port, ip, backlog) {}
explicit echo_server(in_port_t port, std::string_view ip_str, int backlog = std::numeric_limits<int>::max())
: net::tcp_listener<net::sockaddr_type_in, false>(port, ip_str, backlog) {}
protected:
virtual bool transceive(std::atomic_bool const &flag_quit, net::tcp_transceiver<net::sockaddr_type_in, false> const &transceiver) final {
uint8_t buffer[1024]{};
size_t offset = 0;
while(offset < 1024) {
size_t const size = 1024 - offset;
ssize_t const received = transceiver.recv_raw(buffer, size);
if(received == -1) return false;
offset += received;
if(offset && !buffer[offset - 1]) break;
}
size_t const len = offset;
return transceiver.send(buffer, len);
}
private:
};
int main() {
echo_server server(9999, INADDR_ANY);
std::atomic_bool flag_quit(false);
std::thread thread([&server, &flag_quit]() {
server.loop(flag_quit);
});
sleep(5);
flag_quit.store(false, std::memory_order_seq_cst);
thread.join();
}