13#include <netinet/in.h>
14#include <sys/socket.h>
17constexpr size_t BACKLOG = 128;
18constexpr size_t MAX_CONNECTIONS = 1024;
19constexpr size_t MAX_MESSAGE_LEN = 2048;
22 char buffer[MAX_MESSAGE_LEN];
29 std::cerr << std::format(
"Read error: {}\n", n);
37 std::cerr << std::format(
"Write error: {}\n", n);
47 sockaddr_in client_addr;
48 socklen_t client_len =
sizeof(client_addr);
50 server_fd, (
struct sockaddr *)&client_addr, &client_len, 0,
53 std::cerr << std::format(
"Failed to accept connection: {}\n",
62void prepare_address(
const std::string &host, uint16_t port,
64 memset(&addr, 0,
sizeof(addr));
65 addr.sin_family = AF_INET;
66 addr.sin_port = htons(port);
67 inet_pton(AF_INET, host.c_str(), &addr.sin_addr);
70int main(
int argc,
char **argv)
noexcept(
false) {
72 std::cerr << std::format(
"Usage: {} <host> <port>\n", argv[0]);
76 std::string host = argv[1];
77 uint16_t port =
static_cast<uint16_t
>(std::stoi(argv[2]));
79 sockaddr_in server_addr;
80 prepare_address(host, port, server_addr);
82 int server_fd = socket(AF_INET, SOCK_STREAM, 0);
84 std::perror(
"Failed to create socket");
88 if (bind(server_fd, (
struct sockaddr *)&server_addr,
sizeof(server_addr)) <
90 std::perror(
"Failed to bind socket");
95 if (listen(server_fd, BACKLOG) < 0) {
96 std::perror(
"Failed to listen on socket");
101 std::cout << std::format(
"Echo server listening on {}:{}\n", host, port);
105 runtime.fd_table().init(MAX_CONNECTIONS);
Coroutine type used to define a coroutine function.
The event loop runtime for executing asynchronous.
Main include file for the Condy library.
#define CONDY_FILE_INDEX_ALLOC
Placeholder to let io_uring allocate a direct file descriptor.
T sync_wait(Runtime &runtime, Coro< T, Allocator > coro)
Synchronously wait for a coroutine to complete in the given runtime.
auto async_recv(Fd sockfd, Buffer &&buf, int flags)
See io_uring_prep_recv.
auto fixed(int fd)
Mark a file descriptor as fixed for io_uring operations.
MutableBuffer buffer(void *data, size_t size)
Create a buffer object from various data sources.
auto async_close(int fd)
See io_uring_prep_close.
auto async_send(Fd sockfd, Buffer &&buf, int flags)
See io_uring_prep_send.
auto async_accept_direct(Fd fd, struct sockaddr *addr, socklen_t *addrlen, int flags, unsigned int file_index)
See io_uring_prep_accept_direct.
Task< T, Allocator > co_spawn(Runtime &runtime, Coro< T, Allocator > coro)
Spawn a coroutine as a task in the given runtime.