-
-
Save 1Jo1/53d01c4c2172bb0762b5dbcf9ef9c623 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" | |
#include <assert.h> | |
#include <assert.h> | |
#define BACKLOG 512 | |
#define PORT 9700 | |
struct io_uring ring; | |
int setup_io_uring() { | |
struct io_uring_params p; | |
int ret; | |
memset(&p, 0, sizeof(p)); | |
p.flags = IORING_SETUP_SQPOLL; | |
ret = io_uring_queue_init_params(16, &ring, &p); | |
if (ret) { | |
fprintf(stderr, "Unable to setup io_uring: %s\n", strerror(-ret)); | |
return 1; | |
} | |
return 0; | |
} | |
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(); | |
int sock; | |
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_fd = create_server_socket(serv_addr); | |
int *fds = malloc(5 * sizeof(int)); | |
for(int i = 0; i < 5; i++) { | |
fds[i] = -1; | |
} | |
fds[0] = sock_listen_fd; | |
assert(io_uring_register_files(&ring, fds, 5) == 0); | |
//remove server socket entry | |
int newFd = -1; | |
assert(io_uring_register_files_update(&ring, 0, &newFd, 1) == 1); | |
assert(close(sock_listen_fd) == 0); | |
//error binding socket | |
assert(create_server_socket(serv_addr) > 0); | |
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