From 6239f6748a9f153e73dc973ca3872de734b2d90e Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 13 Dec 2019 00:02:48 +0300 Subject: [PATCH] io_uring recvmsg test --- test.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/test.cpp b/test.cpp index bcc5fe41..35121993 100644 --- a/test.cpp +++ b/test.cpp @@ -13,6 +13,11 @@ #include #include +#include +#include +#include +#include + #include #include #include @@ -208,7 +213,7 @@ int main1(int argc, char *argv[]) return 0; } -int main(int argc, char *argv[]) +int main02(int argc, char *argv[]) { std::map strs; strs.emplace(12, "str"); @@ -231,3 +236,41 @@ int main(int argc, char *argv[]) io_uring_queue_exit(&ring); return 0; } + +int main(int argc, char *argv[]) +{ + int listen_fd = socket(AF_INET, SOCK_STREAM, 0); + struct sockaddr_in bind_addr; + assert(inet_pton(AF_INET, "0.0.0.0", &bind_addr.sin_addr) == 1); + bind_addr.sin_family = AF_INET; + bind_addr.sin_port = 13892; + assert(bind(listen_fd, (sockaddr*)&bind_addr, sizeof(bind_addr)) == 0); + assert(listen(listen_fd, 128) == 0); + struct sockaddr_in peer_addr; + socklen_t peer_addr_size = sizeof(peer_addr); + int peer_fd = accept(listen_fd, (sockaddr*)&peer_addr, &peer_addr_size); + assert(peer_fd >= 0); + //fcntl(peer_fd, F_SETFL, fcntl(listen_fd, F_GETFL, 0) | O_NONBLOCK); + + struct io_uring ring; + assert(setup_context(32, &ring) == 0); + void *buf = memalign(512, 4096*1024); + + struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); + assert(sqe); + struct iovec iov = { buf, 4096*1024 }; + struct msghdr msg = { 0 }; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + io_uring_prep_recvmsg(sqe, peer_fd, &msg, 0); + io_uring_sqe_set_data(sqe, buf); + io_uring_submit_and_wait(&ring, 1); + struct io_uring_cqe *cqe; + io_uring_peek_cqe(&ring, &cqe); + int ret = cqe->res; + printf("cqe result: %d\n", ret); + // ok, io_uring's sendmsg always reads as much data as is available and finishes + io_uring_cqe_seen(&ring, cqe); + + return 0; +}