19 std::cout <<
"relay: init.\n";
23 std::cout <<
"relay: quit.\n";
29 if (sockfd.listen(port, 5)) {
31 std::vector<mxnetwork::Socket> sockets;
32 Messages message(&sockets);
33 std::thread background(std::move(message));
35 std::optional<mxnetwork::Socket> new_s = sockfd.accept();
36 if (new_s == std::nullopt) {
43 new_s->setblocking(
false);
44 sockets.push_back(std::move(*new_s));
59 Messages(std::vector<mxnetwork::Socket> *s) : sockets(s) {}
62 std::vector<pollfd> p_fd;
64 std::lock_guard<std::mutex> lock(
mut);
65 p_fd.reserve(sockets->size());
66 for (
const auto &s : *sockets) {
75 std::this_thread::sleep_for(std::chrono::milliseconds(10));
79 int value = poll(p_fd.data(), p_fd.size(), 100);
82 std::lock_guard<std::mutex> lock(
mut);
83 if (p_fd.size() != sockets->size())
85 for (
size_t i = 0; i < p_fd.size(); ++i) {
86 if (p_fd[i].revents & POLLIN) {
87 char buffer[BUFFER_SIZE] = {};
88 ssize_t bytes = (*sockets)[i].read(buffer, BUFFER_SIZE - 1, 0);
90 if (errno != EAGAIN || errno != EWOULDBLOCK) {
91 if (!sockets->empty())
92 (*sockets)[i].close();
94 }
else if (bytes == 0) {
95 (*sockets)[i].close();
96 std::cout <<
"relay: Disconnected safely.\n";
99 std::cout <<
"relay: Got message: " << buffer <<
"\n";
100 send_all(i, buffer, bytes);
104 std::erase_if(*sockets, [](
const mxnetwork::Socket &s) {
107 std::cout <<
"relay: removing dead socket.\n";
114 void send_all(
size_t i,
const char *buffer,
size_t bytes) {
115 for (
size_t z = 0; z < sockets->size(); ++z) {
117 ssize_t b = (*sockets)[z].write(buffer, bytes, 0);
119 if (errno != EAGAIN && errno != EWOULDBLOCK)
120 if (!sockets->empty())
121 (*sockets)[z].close();
124 std::cout <<
"relay: Sent message to: " << (*sockets)[z].sockfd() <<
" " << buffer <<
"\n";
129 std::vector<mxnetwork::Socket> *sockets;