-
-
Save 1Jo1/15cb3c63439d0c08e3589cfa98418b2c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <errno.h> | |
#include <fcntl.h> | |
#include <netinet/in.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <strings.h> | |
#include <sys/socket.h> | |
#include <unistd.h> | |
#include <poll.h> | |
#include "liburing.h" | |
#define BACKLOG 512 | |
#define PORT 9100 | |
struct io_uring ring; | |
void add_poll(struct io_uring *ring, int fd) { | |
struct io_uring_sqe *sqe = io_uring_get_sqe(ring); | |
io_uring_prep_poll_add(sqe, fd, POLLIN); | |
sqe->flags |= IOSQE_IO_LINK; | |
} | |
void add_accept(struct io_uring *ring, int fd) { | |
struct io_uring_sqe *sqe = io_uring_get_sqe(ring); | |
io_uring_prep_accept(sqe, fd, 0, 0, SOCK_NONBLOCK | SOCK_CLOEXEC); | |
sqe->flags |= IOSQE_IO_LINK; | |
} | |
int setup_io_uring() { | |
int ret = io_uring_queue_init(16, &ring, 0); | |
if (ret) { | |
fprintf(stderr, "Unable to setup io_uring: %s\n", strerror(-ret)); | |
return 1; | |
} | |
return 0; | |
} | |
int main(int argc, char *argv[]) { | |
struct sockaddr_in serv_addr; | |
setup_io_uring(); | |
int sock_listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); | |
const int val = 1; | |
setsockopt(sock_listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); | |
memset(&serv_addr, 0, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_port = htons(PORT); | |
serv_addr.sin_addr.s_addr = INADDR_ANY; | |
if (bind(sock_listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
perror("Error binding socket\n"); | |
exit(1); | |
} | |
if (listen(sock_listen_fd, BACKLOG) < 0) { | |
perror("Error listening on socket\n"); | |
exit(1); | |
} | |
setup_io_uring(); | |
add_poll(&ring, sock_listen_fd); | |
add_accept(&ring, sock_listen_fd); | |
io_uring_submit(&ring); | |
while (1) { | |
struct io_uring_cqe *cqe; | |
io_uring_wait_cqe(&ring, &cqe); | |
} | |
io_uring_queue_exit(&ring); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment