11#include <netinet/in.h>
12#include <sys/socket.h>
15constexpr size_t BACKLOG = 128;
16constexpr size_t MAX_CONNECTIONS = 1024;
17constexpr size_t MAX_MESSAGE_LEN = 2048;
20 char buffer[MAX_MESSAGE_LEN];
27 std::fprintf(stderr,
"Read error: %d\n", n);
35 std::fprintf(stderr,
"Write error: %d\n", n);
45 sockaddr_in client_addr;
46 socklen_t client_len =
sizeof(client_addr);
48 server_fd, (
struct sockaddr *)&client_addr, &client_len, 0,
51 std::fprintf(stderr,
"Failed to accept connection: %d\n",
60void prepare_address(
const std::string &host, uint16_t port,
62 memset(&addr, 0,
sizeof(addr));
63 addr.sin_family = AF_INET;
64 addr.sin_port = htons(port);
65 inet_pton(AF_INET, host.c_str(), &addr.sin_addr);
68int main(
int argc,
char **argv)
noexcept(
false) {
70 std::fprintf(stderr,
"Usage: %s <host> <port>\n", argv[0]);
74 std::string host = argv[1];
75 uint16_t port =
static_cast<uint16_t
>(std::stoi(argv[2]));
77 sockaddr_in server_addr;
78 prepare_address(host, port, server_addr);
80 int server_fd = socket(AF_INET, SOCK_STREAM, 0);
82 std::perror(
"Failed to create socket");
86 if (bind(server_fd, (
struct sockaddr *)&server_addr,
sizeof(server_addr)) <
88 std::perror(
"Failed to bind socket");
93 if (listen(server_fd, BACKLOG) < 0) {
94 std::perror(
"Failed to listen on socket");
99 std::printf(
"Echo server listening on %s:%d\n", host.c_str(), port);
103 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.