From 6ef810f5115cdf6f00e32dee65f71b363579e2a4 Mon Sep 17 00:00:00 2001 From: Francesco Date: Wed, 25 Mar 2026 01:56:06 +0100 Subject: [PATCH] refactor(socket): improve read/write --- include/core/socket.h | 4 +-- src/core/socket.c | 62 ++++++++++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/include/core/socket.h b/include/core/socket.h index af7580d..6ffd8f0 100644 --- a/include/core/socket.h +++ b/include/core/socket.h @@ -4,8 +4,8 @@ #include #include -ssize_t cws_socket_read(int sockfd, string_s *str); +int cws_socket_read(int sockfd, string_s *str); -ssize_t cws_socket_send(int sockfd, const char *buffer, size_t len, int flags); +int cws_socket_send(int sockfd, const char *buffer, size_t len, int flags); #endif diff --git a/src/core/socket.c b/src/core/socket.c index 9244b82..870e8ba 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -3,46 +3,64 @@ #include #include -ssize_t cws_socket_read(int sockfd, string_s *str) { +int cws_socket_read(int sockfd, string_s *str) { char tmp[4096] = {0}; - ssize_t n = recv(sockfd, tmp, sizeof tmp, 0); - if (n < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { + for (;;) { + ssize_t n = recv(sockfd, tmp, sizeof tmp, 0); + + /* We have some data */ + if (n > 0) { + tmp[n] = '\0'; + string_append(str, tmp); + return n; + } + + /* Client closed */ + if (n == 0) { return 0; } + + if (errno == EINTR) { + continue; + } + + /* No data now */ + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return -2; + } + + /* Something happened */ return -1; } - - if (n == 0) { - return -1; - } - - tmp[n] = '\0'; - string_append(str, tmp); - return n; } -ssize_t cws_socket_send(int sockfd, const char *buffer, size_t len, int flags) { +int cws_socket_send(int sockfd, const char *buffer, size_t len, int flags) { size_t total_sent = 0; - ssize_t n; while (total_sent < len) { - n = send(sockfd, buffer + total_sent, len - total_sent, flags); + ssize_t n = send(sockfd, buffer + total_sent, len - total_sent, flags); - if (n < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - break; - } - return -1; + if (n > 0) { + total_sent += (size_t)n; + continue; } if (n == 0) { break; } - total_sent += n; + if (errno == EINTR) { + continue; + } + + /* Partial write */ + if (errno == EAGAIN || errno == EWOULDBLOCK) { + break; + } + + return -1; } - return total_sent; + return (ssize_t)total_sent; }