-
-
Save 1Jo1/3ace601884b86f7495fd5241190494dc 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 <assert.h> | |
#include "liburing.h" | |
#define BACKLOG 512 | |
#define PORT 9700 | |
struct io_uring ring; | |
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; | |
} | |
void add_poll(int fd, unsigned int poll_mask) { | |
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); | |
io_uring_prep_poll_add(sqe, fd, poll_mask); | |
} | |
void add_accept(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->user_data = 2; | |
} | |
int create_server_socket(struct sockaddr_in serv_addr) { | |
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)); | |
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); | |
} | |
return sock_listen_fd; | |
} | |
int main(int argc, char *argv[]) { | |
setup_io_uring(); | |
struct sockaddr_in serv_addr; | |
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; | |
int sock_listen_fd1 = create_server_socket(serv_addr); | |
add_poll(sock_listen_fd1, POLLIN); | |
assert(io_uring_submit(&ring) == 1); | |
assert(close(sock_listen_fd1) == 0); | |
//Error binding socket | |
int sock_list_fd2 = create_server_socket(serv_addr); | |
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