From dc71f8872ba4293d295c5bfceab271f2931edbe4 Mon Sep 17 00:00:00 2001 From: Francesco Date: Sat, 25 Oct 2025 01:30:46 +0200 Subject: [PATCH] feat(socket): add socket helpers --- include/utils/socket.h | 10 ++++++++ src/utils/socket.c | 53 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 include/utils/socket.h create mode 100644 src/utils/socket.c diff --git a/include/utils/socket.h b/include/utils/socket.h new file mode 100644 index 0000000..d5cfc2e --- /dev/null +++ b/include/utils/socket.h @@ -0,0 +1,10 @@ +#ifndef CWS_SOCKET_H +#define CWS_SOCKET_H + +#include +#include + +ssize_t cws_read_data(int sockfd, string_s *str); +ssize_t cws_send_data(int sockfd, char *buffer, int len, int flags); + +#endif diff --git a/src/utils/socket.c b/src/utils/socket.c new file mode 100644 index 0000000..a6b3f58 --- /dev/null +++ b/src/utils/socket.c @@ -0,0 +1,53 @@ +#include "utils/socket.h" + +#include +#include + +ssize_t cws_read_data(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) { + /* No data available right now */ + return 0; + } + + return -1; + } + + if (n == 0) { + /* Connection closed */ + return -1; + } + + tmp[n] = '\0'; + string_append(str, tmp); + return n; +} + +ssize_t cws_send_data(int sockfd, char *buffer, int len, int flags) { + ssize_t total_sent = 0; + ssize_t n; + + while (total_sent < len) { + n = send(sockfd, buffer + total_sent, len - total_sent, flags); + + if (n < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + /* Buffer full, return bytes sent */ + break; + } + + return -1; + } + + if (n == 0) { + break; + } + + total_sent += n; + } + + return total_sent; +}