MXVK Vulkan Framework 0.24.0
C++20 Vulkan rendering framework for practical 2D and 3D application development with SDL3.
Loading...
Searching...
No Matches
server.cpp
Go to the documentation of this file.
2#include <atomic>
3#include <cstdlib>
4#include <iostream>
5#include <thread>
6#ifdef _WIN32
7#include <windows.h>
8#ifndef SHUT_RDWR
9#define SHUT_RDWR SD_BOTH
10#endif
11#else
12#include <signal.h>
13#include <sys/socket.h>
14#endif
15
16std::atomic<bool> active_loop{false};
17
18#ifdef _WIN32
19BOOL WINAPI console_handler(DWORD signal) {
20 if (signal == CTRL_C_EVENT || signal == CTRL_CLOSE_EVENT) {
21 active_loop.store(false);
22 return TRUE;
23 }
24 return FALSE;
25}
26#else
27void exit_signal(int) {
28 active_loop.store(false);
29}
30#endif
31
32int main(int argc, char **argv) {
33 if (argc != 2) {
34 std::cerr << "server: Invalid arguments\n"
35 << argv[0] << " <port>\n";
36 return EXIT_FAILURE;
37 }
39#ifdef _WIN32
40 if (!SetConsoleCtrlHandler(console_handler, TRUE)) {
41 std::cerr << "Error setting console handler\n";
42 return EXIT_FAILURE;
43 }
44#else
45 struct sigaction sa = {};
46 sa.sa_handler = exit_signal;
47 sa.sa_flags = 0;
48 if (sigaction(SIGINT, &sa, nullptr) == -1) {
49 perror("sigaction");
50 return EXIT_FAILURE;
51 }
52#endif
53
54 try {
57 if (sock.listen(argv[1], 5)) {
58 active_loop.store(true);
59 while (active_loop.load()) {
60 std::optional<mxnetwork::Socket> s = sock.accept();
61 if (s) {
62 std::thread t([sockfd = sock.sockfd()](mxnetwork::Socket sfd) {
63 char buffer[256];
64 ssize_t bytes = 0;
65 if ((bytes = sfd.read_all(buffer, 255)) > 0) {
66 buffer[bytes] = '\0';
67 std::string value{buffer};
68 if (value.find("exit") != std::string::npos) {
69 active_loop.store(false);
70 std::cerr << "server: Exiting..\n";
71 shutdown(sockfd, SHUT_RDWR);
72 return;
73 }
74 std::cout << value << "\n";
75 } else {
76 std::cerr << "Error reading stream.\n";
77 }
78 }, std::move(*s));
79
80 t.detach();
81 } else {
83 continue;
84 break;
85 }
86 }
87 } else {
88 perror("listen");
89 }
90 } catch (const mxnetwork::Exception &s) {
91 std::cerr << "Exception: " << s.text() << "\n";
92 return EXIT_FAILURE;
93 }
94 return EXIT_SUCCESS;
95}
Lightweight exception wrapper for MXNetwork failures.
Definition exception.hpp:11
std::string text() const
Return the stored error text.
Definition exception.cpp:5
C++ wrapper around the MXNetwork socket API.
Definition socket.hpp:57
bool listen(std::string_view port, int backlog)
Start listening on an Internet port.
Definition socket.cpp:100
std::optional< Socket > accept()
Accept an incoming connection.
Definition socket.cpp:120
mx_socket_fd sockfd() const
Return the underlying socket handle.
Definition socket.cpp:183
int main(void)
Definition main.cpp:7
#define SOCK_ERRNO
Definition mxsocket.h:51
void mx_socket_ignore_pipe_signal()
Ignore SIGPIPE on platforms that require it.
Definition mxsocket.c:577
#define SOCK_EINTR
Definition mxsocket.h:52
@ TYPE_INET
IPv4 stream socket.
Definition socket.hpp:41
std::atomic< bool > active_loop
Definition server.cpp:16
void exit_signal(int)
Definition server.cpp:27
RAII helper that initializes and shuts down the platform socket subsystem.
Definition socket.hpp:21