Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#define BUF_BGID 0
#define N_BUFS 128
#define PAGESIZE 4096
#define BUFSIZE 8192
#define PORT 49000
int main(int argc, char *argv[])
{
struct sockaddr_in addr;
int sock_fd;
char* bufs; // All bufs go here
int i;
struct io_uring ring;
struct io_uring_buf_ring* br = NULL;
struct io_uring_sqe *sqe;
struct io_uring_cqe* cqe;
/* Set up socket */
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_aton("0.0.0.0", &addr.sin_addr);
/* Create UDP socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));
/* Create uring */
if (io_uring_queue_init(N_BUFS, &ring, 0) < 0) {
fprintf(stderr, "Could not init ring.\n");
return 1;
}
/* Create buffers and buffer ring */
if (posix_memalign((void**)&bufs, PAGESIZE, BUFSIZE * N_BUFS)) {
fprintf(stderr, "Could not allocate memory.\n");
return 1;
}
memset((void*)bufs, 0, BUFSIZE * N_BUFS);
int err = 0;
br = io_uring_setup_buf_ring(&ring, N_BUFS, BUF_BGID, 0, &err);
if (!br) {
fprintf(stderr, "Could not create buffer ring.\n");
}
io_uring_buf_ring_init(br);
for (i = 0; i < N_BUFS; i++) {
io_uring_buf_ring_add(br, bufs + i * BUFSIZE, BUFSIZE, i,
io_uring_buf_ring_mask(N_BUFS), i);
}
io_uring_buf_ring_advance(br, N_BUFS);
/* Set up recv SQE */
sqe = io_uring_get_sqe(&ring);
io_uring_sqe_set_flags(sqe, IOSQE_BUFFER_SELECT);
sqe->buf_group = BUF_BGID;
io_uring_prep_recv_multishot(sqe, sock_fd, NULL, 0, 0); /* This doesn't work! */
/*io_uring_prep_recv(sqe, sock_fd, bufs, BUFSIZE, 0);*/ /* This works! */
if (io_uring_submit(&ring) < 0) {
fprintf(stderr, "Failed to submit SQE.\n");
return 1;
}
if (io_uring_wait_cqe(&ring, &cqe) < 0) {
fprintf(stderr, "Could not get CQE.\n");
return 1;
}
if (cqe->res < 0) {
fprintf(stderr, "Bad CQE result: %s\n", strerror(-cqe->res));
return 1;
}
fprintf(stderr, "Buffer index: %d\n", cqe->flags >> IORING_CQE_BUFFER_SHIFT);
/* Now do handling and cleanup. */
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... n-io-uring